基于双变量的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