【问题标题】:R: How to get common counts (frequency) of levels of two factor variables by ID Variable (as new data frame) [duplicate]R:如何通过ID变量(作为新数据框)获得两个因子变量水平的共同计数(频率)[重复]
【发布时间】:2016-02-01 23:42:55
【问题描述】:

为了弄清楚这个问题,让我从我的数据框的一个小例子开始。

ID <- c(rep("first", 2), rep("second", 4), rep("third",1), rep("fourth", 3))
Var_1 <- c(rep("A",2), rep("B", 2), rep("A",3), rep("B", 2), "A")
Var_2 <- c(rep("C",2), rep("D",3) , rep("C",2),  rep("E",2), "D")

DF <- data.frame(ID, Var_1, Var_2)

> DF
       ID  Var_1 Var_2
1   first     A     C
2   first     A     C
3  second     B     D
4  second     B     D
5  second     A     D
6  second     A     C
7   third     A     C
8  fourth     B     E
9  fourth     B     E
10 fourth     A     D

有一个ID 因子变量和两个因子变量Var_1 具有R=2 因子水平和Var_2 具有C=3 因子水平。

我想获得一个新的数据框,其中包含 (RxC)+1=(2x3)+1 变量以及所有因子级别组合的频率 - 分别针对 ID 变量中的每个级别,如下所示:

      ID   A.C  A.D  A.E  B.C  B.D  B.E
1  first    2    0    0    0    0    0
2 second    1    1    0    0    2    0
3  third    1    0    0    0    0    0
4 fourth    0    1    0    0    0    2

我尝试了几个函数,但结果甚至不接近这个,所以它们甚至不值得一提。在原始数据框中,我应该得到 (6x9)+1=55 个变量。

编辑:有单独计算一个或多个变量的因子水平的解决方案,但我无法弄清楚如何对两个(或更多)变量的因子水平组合进行共同计数。当我得到答案时,现在向其他人实施解决方案似乎很容易,但我自己却无法做到。

【问题讨论】:

  • ^^在末尾加括号。

标签: r count frequency


【解决方案1】:

使用 reshape 包中的 dcast 函数(或 data.table,它具有 dcast 函数的增强实现):

library(reshape2)
dcast(DF, ID ~ paste(Var_1,Var_2,sep="."), fun.aggregate = length)

给出:

      ID A.C A.D B.D B.E
1  first   2   0   0   0
2 fourth   0   1   0   2
3 second   1   1   2   0
4  third   1   0   0   0

【讨论】:

  • 这里是我的问题的最佳解决方案,因为它直接与数据框一起产生。
  • 谢谢。但不得不提的是@StevenBeaupré 的方法也会返回一个数据框。
  • 没错,我错过了。对不起史蒂文博普雷。他的方法虽然看起来更个性化,但如果您自己来回答,这是非常好的甚至更好的选择。我还是更喜欢你的提议,因为它是一个常用的功能。
【解决方案2】:

我们可以使用paste 创建一个结合 Var_1 和 Var_2 的变量,然后生成一个带有 ID 和新变量的列联表:

table(DF$ID,paste(DF$Var_1,DF$Var_2,sep="."))

输出

         A.C A.D B.D B.E
  first    2   0   0   0
  fourth   0   1   0   2
  second   1   1   2   0
  third    1   0   0   0

要对表格行排序,我们需要事先factor(DF$ID,levels=c("first","second","third","fourth"))

【讨论】:

    【解决方案3】:

    试试

    library(tidyr)
    library(dplyr)
    
    DF %>%
      unite(Var, Var_1, Var_2, sep = ".") %>%
      count(ID, Var) %>%
      spread(Var, n, fill = 0)
    

    这给出了:

    #Source: local data frame [4 x 5]
    #
    #      ID   A.C   A.D   B.D   B.E
    #  (fctr) (dbl) (dbl) (dbl) (dbl)
    #1  first     2     0     0     0
    #2 fourth     0     1     0     2
    #3 second     1     1     2     0
    #4  third     1     0     0     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多