Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.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_Dplyr_Tidyr_Spread - Fatal编程技术网

基于双变量的Dplyr滤波

基于双变量的Dplyr滤波,r,dplyr,tidyr,spread,R,Dplyr,Tidyr,Spread,我想使用dplyr来确定数据帧中的哪些观测值满足以下条件: 在每个组中,Var1==良好的观察值的Var2组合总数大于Var1==不良 以下是玩具数据框: library(dplyr) set.seed(seed = 10) df <- data.frame("Id" = 1:12, "Group" = paste(sapply(toupper(letters[1:3]), rep, times = 4,simplify = T)),

我想使用
dplyr
来确定数据帧中的哪些观测值满足以下条件:

  • 在每个
    中,
    Var1==良好
    的观察值的
    Var2
    组合总数大于
    Var1==不良
以下是玩具数据框:

library(dplyr)

set.seed(seed = 10)

df <- data.frame("Id" = 1:12,
                 "Group" = paste(sapply(toupper(letters[1:3]), rep, times = 4,simplify = T)),
                 "Var1" = sample(rep(c("good","bad"),times = 1000),size = 12),
                 "Var2" = sample(rep(1:10, times = 1000),size = 12))

print(df)

   Id Group Var1 Var2
1   1     A good    6
2   2     A  bad    9
3   3     A good   10
4   4     A good    7
5   5     B  bad    9
6   6     B  bad    1
7   7     B  bad    6
8   8     B good    6
9   9     C good    1
10 10     C  bad    8
11 11     C good    4
12 12     C  bad    2

接下来我应该采取什么步骤?最后,分析应该返回“A”,因为这是唯一一个
组,其中
好的
观察结果的
总数大于
坏的
观察结果的
总数。

使用
扩展
过滤器
怎么样:

> library(tidyr)
> df %>% group_by(Group, Var1) %>%
+    summarise(Total = sum(Var2)) %>%
+    spread(Var1,Total) %>%
+    filter(good>bad)
Source: local data frame [1 x 3]

  Group bad good
1     A   9   23

data.table
类似的选项。我们将'data.frame'转换为'data.table'(
setDT(df)
),按'Group','Var1'分组,得到'Var2'的
sum
,将'long'整形为'wide',并过滤'good'大于'bad'的行

library(data.table)
dcast(setDT(df)[, sum(Var2) , by = .(Group, Var1)], 
               Group~Var1, value.var='V1')[good>bad]
#   Group bad good
#1:     A   9   23

注意:第一次发布到SO!如果我的问题格式不正确或笨拙,请帮助我解决。欢迎有建设性的批评。第一个问题非常简洁,+1这部作品!我的回答有误,但在我能够纠正它之前,@fishtank已经提供了一个正确的答案。这个解决方案正是我想要的@鱼缸感谢您向我介绍
spread
功能!
library(data.table)
dcast(setDT(df)[, sum(Var2) , by = .(Group, Var1)], 
               Group~Var1, value.var='V1')[good>bad]
#   Group bad good
#1:     A   9   23