2015-06-02 2 views
3

Простой вопрос, но, по-видимому, еще не ответил в 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.

ответ

4

Мы могли бы использовать data.table, конвертировать «data.frame» до «data.table» (setDT(df1)), мы проверяем, есть ли any «автомобиль» в «путешествие» сгруппированных по «человека», преобразовать логический вывод (+0L или обертывание с помощью as.numeric) и назначить (:=) колонке «драйвер». При необходимости, мы можем удалить столбец «отключения», назначив ее 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] 

Или используя аналогичную логику, как описано выше, мы создаем новую колонку с 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) 
+1

@Arun Спасибо за комментарии. Это более компактно – akrun

+1

Спасибо, это доказывает, сколько можно сделать с помощью «с» и setDT! – user3310782

+0

Просто добавьте Я попытался использовать метод setDT (setDT (df) [, driver: = max (trip), by = person], получение ошибки: Тип RHS (целое число) должен соответствовать LHS ('double ') поэтому я предполагаю, что это связано с тем, что одно из моих полей (драйвер) является целым числом, тогда как другое (поездка) определяется как двойное? Любой быстрый способ переназначить тип в самой команде? Спасибо! – user3310782

Смежные вопросы