我有一个数据框:
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次计数?
谢谢!
答案 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"