在R中选择第一个值等于“x”的组。

3
我希望在R中对分组数据进行条件切片。
df <- data.frame(grp = c(1, 1, 2, 2, 3, 3),
                 vehicle = c("car", "boat", "bike", "car", "plane", "bike"))

#>    grp  vehicle
#> 1    1      car
#> 2    1     boat
#> 3    2     bike
#> 4    2      car
#> 5    3    plane
#> 6    3     bike

我想按grp分组,只保留第一行等于car的组。这是解决方案。
#>   grp  vehicle
#> 1   1      car
#> 2   1     boat

我该怎么做?我认为这可能是更好的版本。

library(dplyr)
df %>% group_by(grp) %>% filter(any(slice_head(vehicle == "car")))

#, Error in `filter()`:
#, ! Problem while computing `..1 =
...

3
df %>% group_by(grp) %>% filter(vehicle[1] == 'car') 可以翻译为:在数据框df中,按照grp列进行分组,然后筛选出车辆列(vehicle)第一个值为'car'的行。 - Darren Tsai
5个回答

2

也可以不使用分组,即使用 duplicated 来查找 'grp' 的第一次出现,并检查 'vehicle' 值是否为 "car",并使用该值创建逻辑来处理 'grp'

library(dplyr)
df %>% 
  filter(grp %in% grp[!duplicated(grp) & vehicle == "car"])
  grp vehicle
1   1     car
2   1    boat

2

另一种 data.table 的解决方案:

library(data.table)

setDT(df)[, if(first(vehicle)=="car") .SD, by=grp]

     grp vehicle
   <num>  <char>
1:     1     car
2:     1    boat 

2

data.table

library(data.table)
DT <- as.data.table(df) # setDT is more canonical
DT[, .SD[first(vehicle) == "car",], by = .(grp)]
#      grp vehicle
#    <num>  <char>
# 1:     1     car
# 2:     1    boat

1

使用unique+rowid的另一种data.table选项

> setDT(df)[grp %in% unique(grp)[vehicle[rowid(grp) == 1] == "car"]]
   grp vehicle
1:   1     car
2:   1    boat

0

这个答案是由@Darren Tsai在评论中提供的。

library(dplyr)
df %>% group_by(grp) %>% filter(vehicle[1] == "car")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接