将多行分类为一个变量
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)
一个简单的问题,但显然还没有在 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)