我有一个3种方式的频率表,我想把它们组合成一个列表,通常我写listOfTable <- list(table[,,1],table[,,2],table[,,3],table[,,4],table[,,5])
,有时我的表很长,有任何方法我可以应用lapply
组合成一个列表,而不需要手动。
df <- data.frame(ID = c(rep(c("A","B","C"),5)),
N = c(rep(c("1","2","3"),5)),
M = c(rep(1,3),rep(2,3),rep(3,3),rep(4,3),rep(5,3)))
applyAlist <- table(df$ID,df$N,df$M)
listOfTable <- list(applyAlist[,,1],applyAlist[,,2],applyAlist[,,3],applyAlist[,,4],applyAlist[,,5])
我们可以通过循环遍历第三维序列并基于该序列子集' applylist '来实现lapply
。
lapply(seq(dim(applyAlist)[3]), function(i) applyAlist[,,i])
由于OP需要list
输出,lapply
总是给出该输出。对于sapply
,默认选项是simplify = TRUE
,因此当元素的length
相同(如果我们没有将选项更改为simplify = FALSE
)时,它将返回matrix
或vector
。在list
元素与class
元素不同的情况下,这将变得更加明显并具有破坏性。
lst <- list(a = 1:3, b = rep(letters[1:3], 2), c = 2:4)
lapply(lst, unique)
#$a
#[1] 1 2 3
#$b
#[1] "a" "b" "c"
#$c
#[1] 2 3 4
sapply(lst, unique)
# a b c
#[1,] "1" "a" "2"
#[2,] "2" "b" "3"
#[3,] "3" "c" "4"
,
sapply(lst, unique, simplify = FALSE)
#$a
#[1] 1 2 3
#$b
#[1] "a" "b" "c"
#$c
#[1] 2 3 4
在simplify
lapply
相似的结果最明显的方法是,
sapply(1:5, function(i) list(applyAlist[,,i]))