一个简单的问题,但在StO中显然没有回答。
我有一个很长的数据框,其中3列是:
person | trip | driver
=======================
1 car
1 bike
1 train
1 walk
2 walk
2 train
2 boat
我想要的是填充“驱动程序”列,如果至少其中一个行程是由汽车进行的,则读取为1,否则为0
person | driver
================
1 1
1 1
1 1
1 1
2 0
2 0
2 0
我有一点点偏好这样做而不会重复使用花哨的包,但我对大多数流行的包(例如plyr,data.table,sqldf ....)感到满意,或者甚至是新的那些在从长远来看。
提前致谢,.p。
答案 0 :(得分:4)
我们可以使用data.table
,转换' data.frame'到' data.table' (setDT(df1)
),我们检查是否有any
' car'在旅行中#39按“人物”分组,将逻辑输出转换为数字(+0L
或包裹as.numeric
),并将(:=
)分配给“#driver;'柱。如果需要,我们可以删除旅行'通过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
library(dplyr)
df1 %>%
group_by(person) %>%
mutate(driver= any(trip=='car')+0L) %>%
select(-trip)
或者使用base R
,我们可以使用ave
来创建'驱动程序'然后subset
删除行程'列。
df1$driver <- with(df1, ave(trip=='car', person, FUN=any)+0L)
subset(df1, select=-trip)