假设我有一个未命名的列表,其中每个元素都是一个包含一列或多列的数据框。对于某些列表元素(conv
为TRUE
的那些元素),我想将每列转换为单独的列表元素(因此只有一列的数据框)。一个例子:
x <- list(data.frame(a=c(1,3,4)),
data.frame(v=c("B","C","A"), w=c(12,14,17), h=c(1,2,3)),
data.frame(m=c(2.2,4.1,5.0)),
data.frame(h=c(4,1,2), u=c(9,7,2)))
conv <- c(FALSE, TRUE, FALSE, FALSE)
x
由此,我想去:
x <- list(x[[1]], x[[2]][1], x[[2]][2], x[[2]][3], x[[3]], x[[4]])
x
我可以通过笨拙的循环来做到这一点,但想要更高效的东西。另外,我更喜欢一种坚持base
包功能的解决方案。
答案 0 :(得分:4)
我相信这会做你想要的(请注意,@ DavidArenburg使用[
来提取列):
unlist(recursive=FALSE,
mapply(
function(item, exp) if(exp) lapply(seq(item), function(x) item[x]) else list(item),
x,
conv
) )
以下是str
输出:
List of 6
$ :'data.frame': 3 obs. of 1 variable:
..$ a: num [1:3] 1 3 4
$ :'data.frame': 3 obs. of 1 variable:
..$ v: Factor w/ 3 levels "A","B","C": 2 3 1
$ :'data.frame': 3 obs. of 1 variable:
..$ w: num [1:3] 12 14 17
$ :'data.frame': 3 obs. of 1 variable:
..$ h: num [1:3] 1 2 3
$ :'data.frame': 3 obs. of 1 variable:
..$ m: num [1:3] 2.2 4.1 5
$ :'data.frame': 3 obs. of 2 variables:
..$ h: num [1:3] 4 1 2
..$ u: num [1:3] 9 7 2