2016-08-29 50 views
1

我有一个3路频率表,我想把它们合并成一个列表,通常我写listOfTable <- list(table[,,1],table[,,2],table[,,3],table[,,4],table[,,5]),有时候我的表格真的很长,有什么办法可以申请lapply以手动方式组合为列表。申请3种方式频率表中的列表R

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]) 
+1

'sapply(1:5,功能(ⅰ)列表(表[,, I])) 'FYI,'data.table'与'table'无关(我删除了标签) – Sotos

+1

@Sotos,这很快就非常感谢 – BIN

+1

或者你可以使用'lapply'即'lapply(1:5,function )applyAlist [,, i])' – akrun

回答

1

我们可以通过第三个维度的顺序循环和子集基于序列的“applyAlist”与lapply做到这一点。

lapply(seq(dim(applyAlist)[3]), function(i) applyAlist[,,i]) 

由于OP想要一个list输出,lapply总是给出输出。使用sapply时,默认选项为simplify = TRUE,所以如果我们没有将选项更改为simplify = FALSE,则元素的length将返回matrixvector。在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 

给出相似的结果作为lapply我们改变了simplify

1

最明显的方式做到这一点,

sapply(1:5, function(i) list(applyAlist[,,i])) 
+0

除他的代码不创建名为'table'的对象外。 –