【问题标题】:dplyr, R: Counting a specific value in multiple columns at once [duplicate]dplyr,R:一次计算多列中的特定值[重复]
【发布时间】:2015-09-01 12:21:48
【问题描述】:

我有一个数据框:

md <- data.frame(a = c(3,5,4,5,3,5), b = c(5,5,5,4,4,1), c = c(1,3,4,3,5,5),
      device = c(1,1,2,2,3,3))
myvars = c("a", "b", "c")
md[2,3] <- NA
md[4,1] <- NA
md

我想按设备计算每列中 5 的数量。我可以这样做:

library(dplyr)
group_by(md, device) %>% 
summarise(counts.a = sum(a==5, na.rm = T),
          counts.b = sum(b==5, na.rm = T),
          counts.c = sum(c==5, na.rm = T))

但是,在现实生活中,我会有大量变量(myvars 的长度可能非常大) - 所以我无法手动指定这些 counts.acounts.b 等 - 几十个次。

dplyr 是否允许一次在所有 myvars 列上运行 5 秒计数?

谢谢!

【问题讨论】:

  • 我不知道如何在那里获得名称,但这有效:md %&gt;% group_by(device) %&gt;% summarise_each(funs(counts=sum(.==5,na.rm=TRUE)))
  • @Frank 可能是 md %&gt;% group_by(device) %&gt;% select_(.dots=myvars) %&gt;% summarise_each(funs(counts=sum(.==5,na.rm=TRUE))) 或只是 md %&gt;% group_by(device) %&gt;% summarise_each_(funs(counts=sum(.==5, na.rm=TRUE)), myvars)
  • @akrun 当我运行其中任何一个(R 3.2.0,dplyr 0.4.1)时,结果中仍然没有名称。似乎summarise_each 只是忽略了funs 中的名称...
  • @Frank 没关系,我有不同的想法。我猜你是在谈论count.acount.b 等名称,对吧

标签: r dplyr


【解决方案1】:

如果您关心以“计数”开头的名称。你可以在 dplyr 管道中这样做:

md %>% 
  group_by(device) %>% 
  summarise_each_(funs(sum(.==5,na.rm=TRUE)), myvars) %>% 
  setNames(c(names(.)[1], paste0("counts.", myvars)))
#Source: local data frame [3 x 4]
#
#  device counts.a counts.b counts.c
#1      1        1        2        0
#2      2        0        1        0
#3      3        1        0        2

关于如何命名由 dplyr 的 mutate_each(其行为方式与 summarise_each 相同)生成的新列,还有另一个问答:mutate_each in dplyr: how do I select certain columns and give new names to mutated columns?

【讨论】:

    【解决方案2】:

    reshape2 包中的melt() 函数在这种情况下可能很有用。你可能想试试这个:

     library(reshape2)
     mydf <- melt(md,id="device")
     thefives <- mydf[which(mydf$value==5),]
     print(table(thefives))
    

    这是输出:

    , , value = 5
    
         variable
    device a b c
         1 1 2 0
         2 0 1 0
         3 1 0 2
    

    如果需要,可以将从此输出中获得的table 格式转换为data.frame,方法是先将其转换为matrix

    mydf <- as.data.frame(matrix(table(thefives),nrow=3))
    colnames(mydf) <- c("a","b","c")
    rownames(mydf) <-paste0("device_",c(1:3))
    print(mydf)
    

    这会产生以下结果:

             a b c
    device_1 1 2 0
    device_2 0 1 0
    device_3 1 0 2
    
    > class(mydf)
    [1] "data.frame"
    

    【讨论】:

    • 谢谢。我知道如何在 Base R 中做到这一点,并且 reshape2 也是一个好主意。但我想知道是否可以在 dplyr 中做到这一点。
    • 另外,table() 的输出结构很不方便。最后我需要一个数据框。
    猜你喜欢
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多