【问题标题】:Apply a list for 3 ways frequency table in R [duplicate]在R中应用3种方式频率表的列表[重复]
【发布时间】:2016-08-29 06:38:29
【问题描述】:

我有一个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])

【问题讨论】:

  • sapply(1:5, function(i) list(table[,,i])) 仅供参考,data.table 与 table 无关(我删除了标签)
  • @Sotos,这很快,非常感谢
  • 或者你可以使用lapply,即lapply(1:5, function(i) applyAlist[,,i])
  • @akrun,所以当我们使用 lapply 时,不要使用 list()
  • 如果您打算使用 data.table 方法,那么您应该意识到 applyAlist 对象有 3 个维度,而 data.tables 只有 2 个维度。您应该说明您希望如何处理该问题.. . 作为一个单独的问题。

标签: r dataframe lapply


【解决方案1】:

我们可以用lapply 做到这一点,方法是循环遍历第三维的序列并根据序列对“applyAlist”进行子集化。

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

由于 OP 想要 list 输出,lapply 总是提供该输出。对于sapply,默认选项是simplify = TRUE,因此当我们没有将选项更改为simplify = FALSE 时,当元素的length 相同时,它将返回matrix 或vector。如果list 元素与classes 不同,这将变得更加明显并且具有破坏性。

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 相似的结果

【讨论】:

    【解决方案2】:

    最明显的方法,

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

    【讨论】:

    • 除非他的代码没有创建一个名为table的对象。
    猜你喜欢
    • 1970-01-01
    • 2015-04-29
    • 2019-04-10
    • 2016-05-20
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    相关资源
    最近更新 更多