2015-05-29 204 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