我已阅读并使用了以下问题(Remove specific data frame from a list of data frames in R)的答案,其中一个特定的数据帧将从列表中删除。我现在需要在此基础上继续努力,但是正在努力寻找正确的解决方案。我有48个数据帧的列表,想从列表中删除几个项目,是否可以使用类似的代码?
使用与类似问题相同的示例,如果要删除$ d2是my.list = my.list[-2]
,我将如何删除$ d2,$ d3和$ d6-理想的是同时删除一次还是一次删除?
连续写相同的代码似乎不起作用,例如。
my.list = my.list[-2]
my.list = my.list[-3] #or should this be [-2] as [3] has become [2] when i removed the original [2]
my.list = my.list[-6] #same again
my.list
$d1
y1 y2
1 1 4
2 2 5
3 3 6
$d2
y1 y2
1 3 6
2 2 5
3 1 4
$d3
y1 y2
1 1 4
2 2 5
3 3 6
$d4
y1 y2
1 3 6
2 2 5
3 1 4
$d5
y1 y2
1 1 4
2 2 5
3 3 6
$d6
y1 y2
1 3 6
2 2 5
3 1 4
答案 0 :(得分:1)
使用数字索引的注释中有多种有效答案。这是另一个:
my.list2 <- my.list[ ! #negation operator
names(my.list) %in% c('d2','d3','d6') ] #logical index
#check
> my.list2
$d1
y1 y2
1 1 4
2 2 5
3 3 6
$d4
y1 y2
1 3 6
2 2 5
3 1 4
$d5
y1 y2
1 1 4
2 2 5
3 3 6
您的尝试失败的原因是,my.list
中的值顺序在您删除第一项后就立即更改。请注意,我分配了另一个命名项。这是一个更安全的策略。
我之所以添加逻辑索引方案的示例,是因为它具有出色的通用性。您可以改为使用sapply
定义在每个项目上依次使用的条件。产生的逻辑向量可以用作选择向量。
测试示例:
dput(my.list)
list(d1 = structure(list(y1 = 1:3, y2 = 4:6), class = "data.frame", row.names = c("1",
"2", "3")), d2 = structure(list(y1 = 3:1, y2 = 6:4), class = "data.frame", row.names = c("1",
"2", "3")), d3 = structure(list(y1 = 1:3, y2 = 4:6), class = "data.frame", row.names = c("1",
"2", "3")), d4 = structure(list(y1 = 3:1, y2 = 6:4), class = "data.frame", row.names = c("1",
"2", "3")), d5 = structure(list(y1 = 1:3, y2 = 4:6), class = "data.frame", row.names = c("1",
"2", "3")), d6 = structure(list(y1 = 3:1, y2 = 6:4), class = "data.frame", row.names = c("1",
"2", "3")))