我有一个具有不同列名的数据帧(L)的列表。我想要一个列表的子集,其中包含所有请求的列名,以A和B开头(A和B的顺序并不重要)。
L1 = data.frame(A1 = c(1:4) , Ab = c("u","v","w","x"))
L2 = data.frame(A2 = c(1:4) , Bc = c("u","v","w","x"))
L3 = data.frame(A3 = c(1:4) , Bd = c("u","v","w","x"))
L4 = data.frame(A = c(1:4) , B = c("u","v","w","x"))
L<-list(L1,L2, L3, L4)结果应该是一个包含以A和B开头列的L2、L3和L4的列表。
下面的#######命令给出所有包含列的列表,它们以A或B开头,但不包含子集,这是一个只以A和B开头的列表。
lapply(L, function(x) x[ , grepl( '^A|^B' , names(x))])#######和该函数给出了具有确切请求的列名的列表,而不是以A和B开头的列。
trial <- function(x)
{
reqnames <- c('A', 'B')
L <- lapply(L, function(x) all(reqnames %in% names(x)))
L <- which(L==1)
x[L]
}
trial(L)发布于 2022-07-25 10:52:10
试试这个:
new_list <- lapply(L, \(x) x[
all(
any(grepl("^A", names(x))),
any(grepl("^B", names(x)))
)
]
)这将返回一个空列表代替L1,并将L2的内容返回给L4。
如果您不希望L1的列表为空,您可以再次对其进行子集:
new_list[sapply(new_list, length)>0]https://stackoverflow.com/questions/73107569
复制相似问题