提问人:MAJ 提问时间:11/2/2023 更新时间:11/2/2023 访问量:56
从 R 中的数据帧列表中删除数据帧数
Remove number of data frames from list of data frames in R
问:
假设我在 R 中有一个包含 480 个数据帧的列表。如何每 32 次迭代从列表中删除 16 个数据框?例如,我想删除 c(33:48) 并删除 c(81:96) 等等。
答:
2赞
Gregor Thomas
11/2/2023
#1
您可以创建要删除的索引的向量,然后使用负索引将其删除:
to_remove = unlist(lapply(48 * 1:10, \(x) x - (15:0)))
## check it looks right
to_remove
# [1] 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 129
# [34] 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 225 226
# [67] 227 228 229 230 231 232 233 234 235 236 237 238 239 240 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 321 322 323
# [100] 324 325 326 327 328 329 330 331 332 333 334 335 336 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 417 418 419 420
# [133] 421 422 423 424 425 426 427 428 429 430 431 432 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
## remove them
your_list = your_list[-to_remove]
或者,您可以制作一个要保留的内容的逻辑向量,并使用它来编制索引
keep = rep(rep(c(TRUE, FALSE), times = c(32, 16)), 10)
your_list = your_list[keep]
## another way
keep = (1:480 - 1) %% 48 < 32
your_list = your_list[keep]
评论
0赞
Ian Campbell
11/2/2023
正如我在回答中指出的那样,无需重复逻辑向量,它会自动回收。
1赞
Gregor Thomas
11/2/2023
我不喜欢依赖回收,除了长度 1 的输入。
0赞
Ian Campbell
11/2/2023
在这种情况下,请考虑 ?length.out =
0赞
Gregor Thomas
11/2/2023
那也行得通
0赞
Mike
11/2/2023
#2
您可以将列表转换为 Data.Frame 和子集行,这些行不是每个集的最后 16 个值。
ls2 <- lapply(1:480, function(x) list(as.data.frame(x)))
df <- do.call(rbind, ls2) |>
transform(v2 = rep(1:48, 10)) |>
subset(!v2 %in% 33:48 )
根据下面的@gregor评论进行编辑
只需制作一个重复 1 到 48 的向量,并在它不等于 33 到 48 的地方进行过滤。
idx = rep(1:48, 10)
ls3 <- ls2[!idx %in% 33:48]
评论
0赞
Gregor Thomas
11/2/2023
转换和组合是非常昂贵的操作,假设输入甚至是可匹配的 - 列表中的数据框可能都具有不同的维度!您可以直接在列表中使用相同的逻辑(就像我的答案一样) - 然后idx = rep(1:48, 10)
ls2[!idx %in% 33:48]
0赞
Mike
11/2/2023
一个更简单的解决方案!
6赞
Ian Campbell
11/2/2023
#3
我会推荐:subset
x <- as.list(1:480)
subset(x,c(rep(TRUE,32),rep(FALSE,16)))
#Alternatively rep(c(TRUE,FALSE),times = c(32,16))
请注意,逻辑向量会在列表的长度内自动回收(重复)。
上一个:在分组列表列中捕获最大值
下一个:列表中最后一个数据帧的最后一行
评论
a <- list(mtcars, mtcars*2, mtcars*3, mtcars*4); a <- a[-c(2, 4)]
.就您而言,b <- 1:480; b[(b %/% 32) %% 2 == 0]; your_list <- your_list[b]