【问题标题】:Putting rowwise counts of value occurences into new variables, how to do that in R with dplyr?将值出现的逐行计数放入新变量中,如何在 R 中使用 dplyr 做到这一点?
【发布时间】:2014-05-23 21:05:21
【问题描述】:

我有一个大数据框 (df),如下所示:

structure(list(var1 = c(1, 2, 3, 4, 2, 3, 4, 3, 2), var2 = c(2, 
3, 4, 1, 2, 1, 1, 1, 3), var3 = c(4, 4, 2, 3, 3, 1, 1, 1, 4), 
    var4 = c(2, 2, 2, 2, 3, 2, 3, 4, 1), var5 = c(4, 4, 2, 3, 
    3, 1, 1, 1, 4)), .Names = c("var1", "var2", "var3", "var4", 
"var5"), row.names = c(NA, -9L), class = "data.frame")

  var1 var2 var3 var4 var5
1    1    2    4    2    4
2    2    3    4    2    4
3    3    4    2    2    2
4    4    1    3    2    3
5    2    2    3    3    3
6    3    1    1    2    1
7    4    1    1    3    1
8    3    1    1    4    1
9    2    3    4    1    4

现在我需要逐行计算值的出现次数并创建新的计数变量。结果应该是这样的:

  var1 var2 var3 var4 var5 n_1 n_2 n_3 n_4
1    1    2    4    2    4   1   2   0   2
2    2    3    4    2    4   0   2   1   2
3    3    4    2    2    2   0   3   1   1
4    4    1    3    2    3   1   1   2   1
5    2    2    3    3    3   0   2   3   0
6    3    1    1    2    1   3   1   1   0
7    4    1    1    3    1   3   0   1   1
8    3    1    1    4    1   3   0   1   1
9    2    3    4    1    4   1   1   1   2

如您所见,变量 n_1 显示 1 的行数,n_2 显示 2 的行数,等等。

我尝试了一些 dplyr 功能(因为我喜欢它们的速度),但还没有成功。我知道这绝对是丑陋的代码:-),但我的方法是这样的:

newdf <- mutate(rowwise(df, n_1 = sum(df==1))

有没有人知道如何处理这个问题? 非常感谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这使用来自dplyrrowwise()do(),但这绝对是丑陋的。

    不确定是否有可以修改的内容,以便您直接获得 data.frame 输出,如@https://github.com/hadley/dplyr/releases 所示。

    interim_res <- df %>% 
                      rowwise() %>% 
                      do(out = sapply(min(df):max(df), function(i) sum(i==.)))
    
    interim_res <- interim_res[[1]] %>% do.call(rbind,.) %>% as.data.frame(.)
    

    然后得到预期的结果:

    res <- cbind(df,interim_res)
    

    【讨论】:

    • 谢谢!这是使用 dplyr 的有效解决方案(根据我的具体问题)。
    【解决方案2】:

    这是使用基函数的解决方案

    dd <- t(apply(df, 1, function(x) table(factor(x, levels=1:4))))
    colnames(dd) <- paste("n",1:4, sep="_")
    cbind(df, dd)
    

    只需在 data.frame 的各行中使用 table 命令,即可从 1 到 4 获取每个值的计数。

    【讨论】:

      【解决方案3】:

      这是使用 qdapTools 包的一种方法:

      library(qdapTools)
      
      data.frame(dat, setNames(mtabulate(split(dat, id(dat))), paste0("n_", 1:4)))
      
      ##   var1 var2 var3 var4 var5 n_1 n_2 n_3 n_4
      ## 1    1    2    4    2    4   1   2   0   2
      ## 2    2    3    4    2    4   0   2   1   2
      ## 3    3    4    2    2    2   0   3   1   1
      ## 4    4    1    3    2    3   1   1   2   1
      ## 5    2    2    3    3    3   0   2   3   0
      ## 6    3    1    1    2    1   3   1   1   0
      ## 7    4    1    1    3    1   3   0   1   1
      ## 8    3    1    1    4    1   3   0   1   1
      ## 9    2    3    4    1    4   1   1   1   2
      

      【讨论】:

        猜你喜欢
        • 2015-01-03
        • 1970-01-01
        • 2014-07-23
        • 2023-04-09
        • 2018-11-30
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多