首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于组因素的r-查找行

基于组因素的r-查找行
EN

Stack Overflow用户
提问于 2015-06-30 14:58:09
回答 3查看 80关注 0票数 1

我试图找出一种方法,根据R中的每个因素找到特定的值--换句话说,我如何使所有行都满足每个因素的特定条件,即使该特定行失败了一个条件,但它的相同因素传递了另一行上的条件?

所以我有这样的东西:

代码语言:javascript
运行
复制
   gender values  fruit
1       M     20  apple
2       M     22   pear
3       F     24  mango
4       F     19  mango
5       F      9  mango
6       F     17  apple
7       M     18 banana
8       M     22 banana
9       M     12 banana
10      M     14  mango
11      F      7  apple
12      F      8  apple

我想要每个水果,至少有一个F性别(即使那个水果有一些M's)。也有可能有多个性别,如中性(未显示)。所以我的理想输出是:

代码语言:javascript
运行
复制
   gender values  fruit
1       M     20  apple
3       F     24  mango
4       F     19  mango
5       F      9  mango
6       F     17  apple
10      M     14  mango
11      F      7  apple
12      F      8  apple

请注意,香蕉和梨不见了,因为那些水果只有M's而没有F's。而且,第1行和第10行仍然在那里,尽管它们是M的,因为还有其他苹果和芒果有F的,它仍然适用。如果可能的话请告诉我。谢谢!

下面是我复制这些数据的代码:

代码语言:javascript
运行
复制
gender <- c("M","M","F","F","F","F","M","M","M","M","F","F")
values <- c(20,22,24,19,9,17,18,22,12,14,7,8)
fruit <- c("apple","pear","mango","mango","mango","apple","banana","banana","banana","mango","apple","apple")
df <- data.frame(gender, values, fruit)

到目前为止,我尝试过的是:

代码语言:javascript
运行
复制
df[duplicated(df[,c("fruit","gender")]),]
ave(df$gender, df$fruit, FUN=function(x) ifelse(x=='F','yes','no'))

此外,第三方库是受欢迎的,但我更喜欢停留在R(软件包统计和plyr是好的,因为我有这些在我的系统)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-30 15:16:46

代码语言:javascript
运行
复制
df[df$fruit %in% unique(df[df$gender =='F', ]$fruit),]
#   gender values fruit
#1       M     20 apple
#3       F     24 mango
#4       F     19 mango
#5       F      9 mango
#6       F     17 apple
#10      M     14 mango
#11      F      7 apple
#12      F      8 apple
票数 3
EN

Stack Overflow用户

发布于 2015-06-30 15:19:32

可能的data.table方法

代码语言:javascript
运行
复制
library(data.table)
setDT(df)[, if(any(gender == "F")) .SD, by = fruit]
#    fruit gender values
# 1: apple      M     20
# 2: apple      F     17
# 3: apple      F      7
# 4: apple      F      8
# 5: mango      F     24
# 6: mango      F     19
# 7: mango      F      9
# 8: mango      M     14

我喜欢另一种方法,下面是一个使用二进制联接的data.table等价物

代码语言:javascript
运行
复制
setkey(setDT(df), fruit)[.(unique(df[gender == "F", fruit], by = "fruit"))]
#    gender values fruit
# 1:      F     17 apple
# 2:      F      7 apple
# 3:      F      8 apple
# 4:      M     20 apple
# 5:      F     24 mango
# 6:      F     19 mango
# 7:      F      9 mango
# 8:      M     14 mango
票数 3
EN

Stack Overflow用户

发布于 2015-06-30 19:06:55

基本r、data.table和这里我提供了dplyr解决方案,尽管有些输出是不同的(至少按结果的顺序排列)。

代码语言:javascript
运行
复制
library(dplyr)
df %>% group_by(fruit) %>% filter(any(gender == "F"))
Source: local data frame [8 x 3]
Groups: fruit

  gender values fruit
1      M     20 apple
2      F     24 mango
3      F     19 mango
4      F      9 mango
5      F     17 apple
6      M     14 mango
7      F      7 apple
8      F      8 apple
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31141788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档