一个简单的问题,但显然还没有在 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.
最佳答案
我们可以使用data.table
,将'data.frame'转换为'data.table'(setDT(df1)
),我们检查是否有any
'trip' 中按 'person' 分组的 'car',将逻辑输出转换为数字(+0L
或用 as.numeric
包装)并将 (:=
) 分配给“驱动程序”列。如果需要,我们可以通过将其分配给 NULL
或通过 [, c(1,3), with=FALSE]
library(data.table)
setDT(df1)[, driver := any(trip == 'car')+0L, by = person][, trip := NULL]
或者我们可以使用 max(trip=='car')
而不是 any
,正如评论中提到的@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
创建“driver”,然后使用 subset
删除“trip”列。
df1$driver <- with(df1, ave(trip=='car', person, FUN=any)+0L)
subset(df1, select=-trip)
关于r - 将多行分类为一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30596549/