R:许多嵌套循环删除多个数据框中的行
R: many nested loops to remove rows in multiple data frames
我有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])),]
}}}}
我基本上是在 "which" 处选择第一个值,有一个 "unique" 值的 nest。但是,我得到:
Error in paste0(k, i, j)[(-c(which((paste0(k, i, j, "$nest")) == l)[1])), :
incorrect number of dimensions
可能是因为 "paste0(k,i,j)" 只被认为是一个字符,而不是数据框的名称。
关于如何解决这个问题有什么想法吗?或者任何其他方法来删除每个数据框中每个嵌套的第一行?
感谢各位评论的帮助,我的问题已经解决了
最初,我使用 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()))
从数据框列表开始工作肯定更容易。
我有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])),]
}}}}
我基本上是在 "which" 处选择第一个值,有一个 "unique" 值的 nest。但是,我得到:
Error in paste0(k, i, j)[(-c(which((paste0(k, i, j, "$nest")) == l)[1])), :
incorrect number of dimensions
可能是因为 "paste0(k,i,j)" 只被认为是一个字符,而不是数据框的名称。
关于如何解决这个问题有什么想法吗?或者任何其他方法来删除每个数据框中每个嵌套的第一行?
感谢各位评论的帮助,我的问题已经解决了
最初,我使用 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()))
从数据框列表开始工作肯定更容易。