2015-05-29 628 views
4

我想使用R从数据帧中提取特定的行到新的数据框中。我有两列:CityHousehold。为了检测移动,我需要一个与不同城市的家庭有关的新数据框。如何提取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 

编辑:从注释

+1

或者只是'DF%>%GROUP_BY(家用)%>%滤波器(长度(独特(市))> 1)' – shadow

+0

@shadow的确如此,谢谢! – scoa

+0

'dplyr'中有'n_distinct'功能 –

2

基础R加入@shadow和@davidarenburg建议可能的解决方案

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(城市)> 1)从第一个答案,它的工作:) – Marie