【发布时间】:2023-03-23 06:14:01
【问题描述】:
当这些变量不符合某些条件时,我正在使用一个函数从列表中的每个 data.frame 中删除各个列,并且我想要一种方便的方法来查看哪些列已被删除。现实世界的 data.frames 将有 1000 多个不同的colnames,这些名称有些重叠。
在这个简化的例子中,我想得到一个列表,显示每个 data.frame 的变量,这些变量存在于 list1 中,但在 list2 中不存在。
输入列表
> list1
$A
a b
1 2 3
$B
c d e
1 9 8 1
$C
f g
1 6 7
> list2
$A
a
1 2
$B
c d
1 9 8
$C
g
1 7
期望的输出
我想保留列表结构,以便查看从每个 data.frame 中删除了哪些列。
$A
b
1 3
$B
e
1 1
$C
f
1 6
我的尝试
我看过 SO,但只找到了与比较 data.frames 相关的解决方案。请记住,列表元素的名称(此处为 A、B 和 C)在列表中将始终相同。我的想法是使用setdiff 或setdiff 和mapply,但我的修修补补并没有成果。可以做什么?
## sample data
list1 <- list(A=data.frame(a=2, b=3), B=data.frame(c=9,d=8,e=1), C=data.frame(f= 6,g=7))
list2 <- list(A=data.frame(a=2), B=data.frame(c=9,d=8), C=data.frame(g=7))
desired_output <- list(A=data.frame(b=3), B=data.frame(e=1), C=data.frame(f= 6))
## attempts
# gives List 1
setdiff(list1, list2)
# gives 'Error: not compatible: Cols in x but not y: `b`.'
mapply(setdiff, x = list1, y = list2)
# gives 'Error in list1[[i]] : recursive indexing failed at level 3'
mapply(setdiff, x = colnames(list1[[i]]), y = colnames(list2[[i]]))
# gives 'list()'
mapply(setdiff, x = colnames(list1[i]), y = colnames(list2[i]))
# Gives 'Error in list1[colnams] : invalid subscript type 'list''
colnams <- list()
for(i in seq_along(list1)){
colnams[i] <- !colnames(list1[[i]]) %in% colnames(list2[[i]])
}
list1[colnams]
【问题讨论】: