R:许多嵌套循环,用于删除多个数据框中的行

时间:2017-08-14 23:23:46

标签: r for-loop nested-loops

我有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])),]
}}}}

我基本上选择&#34的第一个值;"有一个独特的"巢的价值。但是,我得到了:

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

可能是因为" paste0(k,i,j)"仅被视为字符,不会被识别为数据框的名称。

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

1 个答案:

答案 0 :(得分:0)

感谢评论的帮助,我的问题得到了解决。

最初,我使用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()))

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