根据特定值 (=> unique(table[[i]]$COLUMN)[1]) 对嵌套列表中的数据帧进行排序?

Ordering dataframes within a nested list based on a specific value (=> unique(table[[i]]$COLUMN)[1])?

提问人:Emmr 提问时间:12/16/2022 更新时间:12/20/2022 访问量:22

问:

好。。深吸一口气

我有一个名为 tables 的嵌套列表,它是数据帧的列表。

这些数据框具有共同的基础和自己的特定条件列。 我有一个数量不明的此类数据框,我必须每周编译一次。

例如:

表[[1]]


# A tibble: 8 × 6
  DATE                SUPERVISOR SECTOR    ACTIVITY   `FERTILIZER#Criterion 1` `FERTILIZER#Criterion 2`
  <dttm>              <chr>      <chr>     <chr>                         <dbl>                    <dbl>
1 2022-10-05 00:00:00 BG         SECTOR 1  FERTILIZER                        1                        0
2 2022-10-05 00:00:00 BG         SECTOR 3  FERTILIZER                        1                        0
3 2022-10-05 00:00:00 BG         SECTOR 6  FERTILIZER                        1                        1
4 2022-10-05 00:00:00 BG         SECTOR 8  FERTILIZER                        0                        0
5 2022-10-05 00:00:00 BG         SECTOR 9  FERTILIZER                        0                        0
6 2022-10-05 00:00:00 BG         SECTOR 13 FERTILIZER                        0                        1
7 2022-10-05 00:00:00 BG         SECTOR 14 FERTILIZER                        0                        0
8 2022-10-05 00:00:00 BG         SECTOR 15 FERTILIZER                        0                        0

表[[2]]

# A tibble: 8 × 6
  DATE                SUPERVISOR SECTOR    ACTIVITY `PLANTING#Criterion 1` `PLANTING#Criterion 2`
  <dttm>              <chr>      <chr>     <chr>                     <dbl>                  <dbl>
1 2022-11-10 00:00:00 AC         SECTOR 6  PLANTING                      1                      0
2 2022-11-11 00:00:00 AC         SECTOR 3  PLANTING                      1                      0
3 2022-11-12 00:00:00 AC         SECTOR 6  PLANTING                      1                      1
4 2022-11-13 00:00:00 AC         SECTOR 8  PLANTING                      0                      0
5 2022-11-14 00:00:00 AC         SECTOR 10 PLANTING                      0                      0
6 2022-11-15 00:00:00 AC         SECTOR 1  PLANTING                      0                      1
7 2022-11-16 00:00:00 AC         SECTOR 1  PLANTING                      0                      0
8 2022-11-17 00:00:00 AC         SECTOR 1  PLANTING                      0                      0

因此,当我将它们绑定在一起时,它会产生以下结果:

> library(dplyr)
> MEGATABLE <- bind_rows(tables)
> head(MEGATABLE)
# A tibble: 6 × 8
  DATE                SUPERVISOR SECTOR    ACTIVITY   `FERTILIZER#Criterion 1` `FERTILIZER#Criterion 2` `Planting#Criterio…` `Planting#Crit…`
  <dttm>              <chr>      <chr>     <chr>                         <dbl>                    <dbl>                <dbl>            <dbl>
1 2022-10-05 00:00:00 BG         SECTOR 1  FERTILIZER                        1                        0                   NA               NA
2 2022-10-05 00:00:00 BG         SECTOR 3  FERTILIZER                        1                        0                   NA               NA
3 2022-10-05 00:00:00 BG         SECTOR 6  FERTILIZER                        1                        1                   NA               NA
4 2022-10-05 00:00:00 BG         SECTOR 8  FERTILIZER                        0                        0                   NA               NA
5 2022-10-05 00:00:00 BG         SECTOR 9  FERTILIZER                        0                        0                   NA               NA
6 2022-10-05 00:00:00 BG         SECTOR 13 FERTILIZER                        0                        1                   NA               NA

我通过 list.files(“TABLE_FILE”) 导入表,它们有随机名称,因此它们的顺序可能非常随机。因此,它们在“表”列表中的顺序将是随机的。因此,MEGATABLE中条件列的顺序也是随机的。如何根据 unique(tables[[i]]$ACTIVITY)[1]) 强制“表”中数据帧的顺序?因此,例如,我会决定在 MEGATABLE 中,我希望首先显示 PLANTING#Criteria,然后是 FERTILIZER#Criteria,然后是 COUNTING#Criteria,依此类推。

请注意,这些 critera 列的名称没有任何模式,因此我无法按名称排序。

提前致谢!

r 嵌套列表 进行排序

评论

0赞 akrun 12/16/2022
你的问题不清楚。是否所有 data.frames 都具有相同的 ACTIVITY 唯一值。根据显示的输入,显示在第二个列表元素中,但为什么要这样做,这似乎只有一个唯一值tablesPLANTINGunique(tables[[i]]$ACTIVITY)[1])
0赞 akrun 12/16/2022
如果你想要一个自定义订单,你可以创建一个向量v1 <- c("PLANTING", "FERTILIZER"); bind_rows(tables[match(sapply(tables, function(x) x$ACTIVITY[1]), v1)])
0赞 Emmr 12/16/2022
你好。是的,表可能有两个不同的活动,但由于它们具有相同的条件列,因此按其中一个或另一个排序实际上没有区别。非常感谢。我会试一试。
0赞 Emmr 12/20/2022
你好,又来了。我刚刚试过这个。它不起作用,因为我每个“类型”都有多个表。我需要找到一种根据活动重新排序表然后绑定它的方法。

答:

0赞 Emmr 12/20/2022 #1

我用过这个,它起作用了(可能有更干净的方法。我很高兴知道):

v1 <- c("PLANTING","FERTILIZER","DRAINAGE","IRRIGATION")

b <- list()
for (j in 1:length(v1)) {
      a <- list()
for (i in 1:length(tables)) {
    if (unique(tables[[i]]$ACTIVITY)[1] == v1[j]) {
      k <- length(a) + 1
      a[[k]] <- tables[[i]]
      b[[j]] <- bind_rows(a)
    } 
  }
}

MEGATABLE <- bind_rows(b)