r语言 - 按列名称在列表中对列表进行子集,以所有请求的模式开头



我有一个具有不同列名的数据帧(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)

结果应该是一个包含L2、L3和L4的列表,其中包含以a和B开头的列。

#######以下命令给出所有包含以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)

试试这个:

new_list  <- lapply(L, (x) x[
all(
any(grepl("^A", names(x))),
any(grepl("^B", names(x)))
)
]
)

这将返回一个空列表来代替L1,并返回L2L4的内容。

如果你不想要L1的空列表,你可以再次对其进行子集设置:

new_list[sapply(new_list, length)>0]

最新更新