dplyr,R:一次计算多列中的特定值

时间:2015-06-16 15:19:00

标签: r dplyr

我有一个数据框:

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.a,{{手动1}}等等 - 几十次。

counts.b是否允许一次在所有dplyr列上运行5次计数?

谢谢!

2 个答案:

答案 0 :(得分:3)

如果你关心以“计数”开头的名字。你可以在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

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

答案 1 :(得分:2)

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

 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"