将多行分类为一个变量

Categorise multiple rows into one variable

一个简单的问题,但显然还没有在 StO 中回答。

我有一个长数据框,其中 3 列是:

person | trip |  driver
=======================
1       car 
1       bike
1       train
1       walk
2       walk
2       train
2       boat

我想要填充列 'driver',以便如果 至少 有一次旅行是乘汽车进行的,则该列为 1,否则为 0:

person | driver
================
1       1 
1       1
1       1
1       1
2       0
2       0
2       0

我稍微倾向于这样做而不会重复花哨的包,但我对大多数流行的包(例如 plyr、data.table、sqldf....)甚至新包都很满意从长远来看证明是有帮助的。

提前致谢,.p.

我们可以使用data.table,将'data.frame'转换为'data.table'(setDT(df1)),我们检查是否有any 'car' 'trip' 按 'person' 分组,将逻辑输出转换为数字(+0L 或用 as.numeric 包装)并将(:=)分配给 'driver'柱子。如果需要,我们可以通过将 'trip' 列分配给 NULL 或按 [, c(1,3), with=FALSE]

子集来删除它
library(data.table)
setDT(df1)[, driver := any(trip == 'car')+0L, by = person][, trip := NULL]

或者代替any,我们可以使用max(trip=='car')作为@Arun在评论中提到的

setDT(df1)[, driver := max(trip == 'car'), by = person]

或者使用与上述类似的逻辑,我们 group_by 'person' 并使用 mutate 创建一个新列并使用 select[=30= 删除不需要的列]

library(dplyr)
df1 %>%
   group_by(person) %>% 
   mutate(driver= any(trip=='car')+0L) %>%
   select(-trip)

或者使用 base R,我们可以使用 ave 创建 'driver' 然后 subset 删除 'trip' 列。

df1$driver <- with(df1, ave(trip=='car', person, FUN=any)+0L)
subset(df1, select=-trip)