我有一个具有不同列名的数据帧(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
,并返回L2
到L4
的内容。
如果你不想要L1
的空列表,你可以再次对其进行子集设置:
new_list[sapply(new_list, length)>0]