2015-05-29 3 views
4

Я хотел бы выделить определенные строки из фрейма данных в новый фреймворк с использованием R. У меня есть два столбца: City и Household. Чтобы обнаружить движение, я хочу новый блок данных с домохозяйствами, у которых нет того же города.Как извлечь определенные строки в R?

Например, если домохозяйка появляется 3 раза, по крайней мере, один город отличается от других, я держу его. В противном случае я удалю 3 строки этого домашнего хозяйства.

City  Household 
    Paris    A 
    Paris    A 
    Nice    A 
    Limoge    B 
    Limoge    B 
Toulouse    C 
    Paris    C 

Здесь я хочу сохранить только для домашнего A и домашнего хозяйства C.

ответ

2

Раствор dplyr: вычислить длину уникальных городов для каждого домашнего хозяйства и держать только те, с длиной> 1

library(dplyr) 
df <- data.frame(city=c("Paris","Paris","Nice","Limoge","Limoge","Toulouse","Paris"), 
       household =c(rep("A",3),rep("B",2),rep("C",2))) 

new_df <- df %>% group_by(household) %>% 
    filter(n_distinct(city) > 1) 

Source: local data frame [5 x 2] 
Groups: household 

     city household 
1 Paris   A 
2 Paris   A 
3  Nice   A 
4 Toulouse   C 
5 Paris   C 

Edit: добавлена ​​@shadow и @davidarenburg предложения от комментариев

+1

Или просто 'ДФ%>% group_by (бытовые)%>% фильтр (длина (уникальный (город))> 1) ' – shadow

+0

@shadow действительно, спасибо! – scoa

+0

В 'dplyr' есть функция' n_distinct' –

2

Base R Возможное решение

df1[with(df1, ave(as.character(City), Household, FUN=function(x) length(unique(x))) > 1L),] 

Или

df1[df1$Household %in% names(which(table(unique(df1)$Household) > 1)),] 

Или возможно data.table v> = 1.9.5 devel version решение

library(data.table) # v > 1.9.5, otherwise use length(unique(City)) 
setDT(df1)[, if(uniqueN(City) > 1L) .SD, by = Household] 

Или

setDT(df1)[, .SD[uniqueN(City) > 1L], by = Household] 
+0

Спасибо, что помогли мне! Я использовал: new_df <- df %>% group_by (домашний)%> фильтр% (n_distinct (city)> 1) из первого ответа и он работал :) – Marie

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