【问题标题】:R: many nested loops to remove rows in multiple data framesR:许多嵌套循环以删除多个数据框中的行
【发布时间】:2017-08-14 23:23:45
【问题描述】:

我有18个数据框,分别称为regular55、regular56、regular57、collar55、collar56等。在每个数据框中,我想删除每个嵌套的第一行。

每个数据框如下所示:

   nest interval
1    17    -8005
2    17      183
3    17      186
4    17      221
5    17      141
6    17       30
7    17      158
8    17       23
9    17      199
10   17       51
11   17      169
12   17      176
13   31      905
14   31      478
15   31       40
16   31      488
17   31       16
18   31      203
19   31       54
20   31      341
21   31       54
22   50   -14164
23   50       98
24   50     1438
25   71      240
26   71      725
27   71      819
28   85   -13935
29   85       45
30   85      589
31   85       47
32   85      161
33   85       67

我想出的避免为 18 个数据帧中的每一个都写出函数的解决方案包括许多嵌套循环:

for (i in 5:7){
  for (j in 5:7) {
    for (k in c("regular","collar")){
      for (l in c(unique(paste0(k,i,j,"$nest")))){
        paste0(k,i,j)=paste0(k,i,j)[(-c(which((paste0(k,i,j,"$nest")) == l )
[1])),]
}}}}

我基本上是选择第一个值“其中”有嵌套的“唯一”值。但是,我得到:

Error in paste0(k, i, j)[(-c(which((paste0(k, i, j, "$nest")) == l)[1])),  : 
incorrect number of dimensions

这可能是因为“paste0(k,i,j)”仅被视为一个字符,而不是被识别为数据框的名称。

关于如何解决这个问题的任何想法?或者任何其他方法来删除每个数据框中每个嵌套的第一行?

【问题讨论】:

  • 以下将返回每个嵌套除第一行之外的所有行(假设数据框名为df)。 library(dplyr); df %>% group_by(nest) %>% slice(2:n())。您可以将其打包成一个函数并在每个数据帧上运行它。或者,更好的是,将您的数据帧读入一个列表并使用lapply 在列表中的每个数据帧上运行上述代码(例如,df.list.updated = lapply(df.list, function(d) d %>% group_by(nest) %>% slice(2:n()))
  • (1) 强烈同意@eipi10,建议您在处理多个类似结构的帧时尝试lists of data frames。 (2) “被认为是一个字符而不被识别为名称” ...见?get。 (3) 既然你对所有人都做同样的事情,为什么不只是for (nm in c("regular55", ...)) { group/subset}?名称向量可以手动导出或使用ls() 和一些过滤器生成。
  • (我编辑了我之前的评论以考虑分组。)

标签: r for-loop nested-loops


【解决方案1】:

感谢cmets的帮助,我的问题解决了。

最初,我使用 for 循环划分我的数据框,然后将其分组到一个列表中:

for (i in 5:7) {
  for (j in 5:7) {
    for (k in c("regular","collar")){
    assign(paste0(k,i,j),
           df[df$x == i & df$y == j & df$z == k,])
}}}

df.list=mget(ls(pattern=("[regular,collar][5-7][5-7]")))

后来我找到了一种方法,可以将我的数据框直接拆分为基于多列的列表 (R subsetting a data frame into multiple data frames based on multiple column values):

df.list= split(df, with(df, interaction(df$x, df$y, df$z)), drop = TRUE)

最后,我能够应用该函数来删除每个嵌套的第一行:

df.list.updated = lapply(df.list, function(d) d %>% group_by(nest) %>% 
slice(2:n()))

从数据框列表中工作肯定更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多