【问题标题】:How do I get two lists together in R?如何在 R 中将两个列表放在一起?
【发布时间】:2011-06-07 20:44:08
【问题描述】:

我正在使用R 中的table 命令生成两个表。我想制作一个表/数据框/矩阵,以便表示两个表中的所有名称,并且输出中包含正确的“零”计数。例如

我目前拥有的数据如下所示

表 1

A   B   C
1   2   4

表 2

C   D   E
3   4   4

我希望得到如下输出:

    Table1 Table2
A        1      0
B        2      0
C        4      3
D        0      4
E        0      4

如何在 R 中做到这一点?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    无需重塑:

    t1 <- table(c("A", rep("B", 2), rep("C", 4)))
    t2 <- table(c(rep("C", 3), rep("D", 4), rep("E", 4)))
    
    ndf <- merge(t1, t2, by = "Var1", all = TRUE)
    ndf[is.na(ndf)] <- 0
    ndf
      Var1 Freq.x Freq.y
    1    A      1      0
    2    B      2      0
    3    C      4      3
    4    D      0      4
    5    E      0      4
    

    【讨论】:

    • 谢谢@EDi,这是救命稻草。
    【解决方案2】:

    忽略我认为您问题中的错字(C 频率应该是 4 和 3,对,而不是 2 和 3?)您可以通过强制数据帧然后合并来做到这一点:

    t1 <- table(rep(LETTERS[1:3],times=c(1,2,4)))
    t2 <- table(rep(c("C","D",'E'),times=c(3,4,4)))
    merge(as.data.frame(t1),as.data.frame(t2),by="Var1",all=T)
    

    然后将 NA 转换为零。

    【讨论】:

      【解决方案3】:

      数据

      dat <- list(rep(LETTERS[1:3],times=c(1,2,4)),rep(LETTERS[3:5],times=c(3,2,2)))
      

      代码

      f <- function(d){
             lev <- unique(unlist(d, use.names=FALSE))
             d <- lapply(d, factor, levels=lev)
             r <- do.call(cbind, lapply(d, table))
             colnames(r) <- paste("Table", seq(NCOL(r)), sep="")
             return(r)
           }
      

      输出

      f(dat)
        Table1 Table2
      A      1      0
      B      2      0
      C      4      3
      D      0      2
      E      0      2
      

      【讨论】:

      • 演示如何在 R 中编写(和使用)函数的好方法。
      • 嗨!这是一个很好的解决方案和一个很好的演示。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 2017-11-26
      • 2020-09-11
      • 1970-01-01
      • 2021-07-03
      相关资源
      最近更新 更多