选择具有特定值的行

问题描述 投票:0回答:4

我有一个数据框,我只想保留其中的某些行。

数据框(总共大约 1000 行相似的行和 var1 中更多的可能性)看起来像这样:

姓名 var1
房子
凯特
米兰达 房子
艾希礼
艾希礼 房子
迈克
迈克 游艇

我想只保留有“汽车”和“房子”的人的行(所以保留 Jay 和 Ashley 的行,并丢弃 Kate 、 Miranda 和 Mike 的行)。我知道如何根据特定条件选择行,但我只能想到将 Kate 和 Miranda 或 Mike 保留在数据框中的方法。我不确定如何解决这个问题?谢谢你的建议。

r dataframe filter subset
4个回答
2
投票

有了基数 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

2
投票

试试这个:

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)

1
投票

数据

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

0
投票

获取每个名称的资产数量,其中资产与我们的集合相匹配,然后是子集:

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
© www.soinside.com 2019 - 2024. All rights reserved.