2015-06-16 50 views
1

我有一个数据帧计数在多个列中的特定值:dplyr,R:在一次

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列上运行5s的计数?

谢谢!

+2

请参阅'?summarise_each'和http://stackoverflow.com/questions/21644848/summarizing-multiple-columns-with-dplyr?rq=1 –

+2

我不知道如何获得那里的名字,但这个作品:'md%>%group_by(device)%>%summarise_each(funs(counts = sum(。== 5,na.rm = TRUE)))' – Frank

+0

@Frank可能是'md%>%group_by(设备)% >%select _(。dots = myvars)%>%summarise_each(funs(counts = sum(。== 5,na.rm = TRUE)))''或者'md%>%group_by(device)%>%summarise_each_ (count = sum(。== 5,na.rm = TRUE)),myvars)' – akrun

回答

0

我相信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 

我很抱歉,我不能和你的问题帮助有关可能获得这个结果与dplyr。不过,如果你想使用的代码,我建议这依赖于reshape2以上,如果table格式是一个障碍,然后一种到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" 

我希望这会有所帮助,即使你对dplyr问题一直未得到答复为止。希望其他人能够回答这个问题。

+0

谢谢。我知道如何在Base R中做到这一点,并且reshape2也是一个好主意。但我想知道是否有可能在dplyr中做到这一点。 – user2323534

+1

此外,输出的结构是表()是不方便的。我最后需要一个数据框。 – user2323534

3

如果您关心以“counts”开头的名称。你可以做这样一个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相同)产生新的列其他Nexus Q &一个位置:mutate_each in dplyr: how do I select certain columns and give new names to mutated columns?