Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr,R:一次在多个列中计算特定值_R_Dplyr - Fatal编程技术网

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

dplyr,R:一次在多个列中计算特定值,r,dplyr,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 然而,在现实生活中,我会有大量的变量(MyVar的长度可能非常大),因此我无法手动指定这些计数。a,计数。b等几十次 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
然而,在现实生活中,我会有大量的变量(MyVar的长度可能非常大),因此我无法手动指定这些
计数。a
计数。b
等几十次

dplyr
是否允许同时对所有
myvars
列运行5s计数

谢谢大家!

在这种情况下,来自
restrape2
包的
melt()
函数可能很有用。您可能希望尝试以下方法:

 library(reshape2)
 mydf <- melt(md,id="device")
 thefives <- mydf[which(mydf$value==5),]
 print(table(thefives))
如果需要,从该输出获得的
表格
格式可以通过首先将其转换为
矩阵
转换为
数据帧

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

如果您关心以“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
(其行为方式与
summary_each
)生成的新列:。

请参见
?summary_each
,我不确定如何在那里命名,但这是有效的:
md%>%groupby(device)%%>%summary_each(funs(counts=summary=5,na.rm=TRUE)))
@Frank可能是
md%>%groupby(device)%%>%select(dots=myvars)%%>%summary(funs(counts=sum(.==5,na.rm=TRUE))
或者只是
md%>%groupby(device)%%summary(funs(counts=sum(.==5,na.rm=TRUE)),myvars)
@akrun当我运行其中任何一个(r3.2.0,dplyr 0.4.1)时,结果中仍然没有名字)。似乎
总结每个
只是忽略了
funs
里面的名字…@Frank没关系,我觉得有些不同。我猜你是在说名字里的count.a
count.b
等等,对吧谢谢。我知道如何在BaseR中进行,重塑2也是一个好主意。但是我想知道是否有可能在dplyr中实现。另外,输出的结构是table()的,不方便。最后我需要一个数据框。
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"
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