将多行分类为一个变量

时间:2015-06-02 12:46:24

标签: r categories

一个简单的问题,但在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。

1 个答案:

答案 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)