我有一个数据框,我只想保留其中的某些行。
数据框(总共大约 1000 行相似的行和 var1 中更多的可能性)看起来像这样:
姓名 | var1 |
---|---|
杰 | 车 |
杰 | 房子 |
凯特 | 车 |
米兰达 | 房子 |
艾希礼 | 车 |
艾希礼 | 房子 |
迈克 | 车 |
迈克 | 游艇 |
我想只保留有“汽车”和“房子”的人的行(所以保留 Jay 和 Ashley 的行,并丢弃 Kate 、 Miranda 和 Mike 的行)。我知道如何根据特定条件选择行,但我只能想到将 Kate 和 Miranda 或 Mike 保留在数据框中的方法。我不确定如何解决这个问题?谢谢你的建议。
有了基数 R,我们可以像下面那样使用
subset
+ ave
> subset(df, as.logical(ave(var1, name, FUN = \(x) all(c("car", "house") %in% x))))
name var1
1 Jay car
2 Jay house
5 Ashley car
6 Ashley house
试试这个:
library(tidyverse)
df %>%
# for each `name`...
group_by(name) %>%
# ...paste all `var1` values together:
mutate(temp = str_c(var1, collapse = ",")) %>%
# filter rows of value combinations of interest:
filter(temp == "car,house") %>%
# remove `temp`:
select(-temp)
编辑:
拿起@zx8754的评论,您可以先
arrange
var1
中的值按字母顺序排列:
df %>%
group_by(name) %>%
arrange(var1) %>%
mutate(temp = str_c(var1, collapse = ",")) %>%
filter(temp == "car,house") %>%
select(-temp)
数据
df=structure(list(var1 = c("car", "car", "car", "car", "house",
"house", "house"), name = c("Jay", "Kate", "Ashley", "Mike",
"Jay", "Miranda", "Ashley"), w = c(1, 1, 1, 1, 1, 1, 1)), row.names = c(NA,
-7L), class = "data.frame")
第一选择
do.call(
rbind,
by(df,list(df$name),function(x){
if (all(c("house","car") %in% unlist(x["var1"]))) x else NULL
})
)
name var1
Ashley.5 Ashley car
Ashley.6 Ashley house
Jay.1 Jay car
Jay.2 Jay house
第二种选择
x=data.frame(
"var1"=c("house","car"),
"w"=1
)
df=merge(df,x,by="var1")
df[ave(df$w,df$name,FUN=sum)==nrow(x),]
var1 name w
1 car Jay 1
3 car Ashley 1
5 house Jay 1
7 house Ashley 1
获取每个名称的资产数量,其中资产与我们的集合相匹配,然后是子集:
assets <- c("car", "house")
x <- table(df[ df$var1 %in% assets, "name"])
df[ df$name %in% names(x)[ x >= length(assets) ], ]
# name var1
# 1 Jay car
# 2 Jay house
# 5 Ashley car
# 6 Ashley house