【问题标题】:How to extract specific rows in R?如何提取R中的特定行?
【发布时间】:2015-05-29 08:55:44
【问题描述】:

我想使用 R 将数据框中的特定行提取到新的数据框中。我有两列:CityHousehold。为了检测移动,我想要一个包含不同城市的家庭的新数据框。

例如,如果一个家庭出现 3 次,并且至少有一个城市与其他城市不同,我会保留它。否则,我删除这户人家的 3 行。

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

在这里,我只想保留家庭A 和家庭C

【问题讨论】:

    标签: r


    【解决方案1】:

    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
    

    编辑:添加来自 cmets 的 @shadow 和 @davidarenburg 建议

    【讨论】:

    • 或者只是df %&gt;% group_by(household) %&gt;% filter(length(unique(city)) &gt; 1)
    • dplyr中有n_distinct函数
    • 谢谢!我用过:new_df % group_by(household) %>% filter(n_distinct(city) > 1) 效果很好!
    【解决方案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]
    

    【讨论】:

    • 感谢您的帮助!我从第一个答案中使用了: new_df % group_by(household) %>% filter(n_distinct(city) > 1) 并且有效:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2020-03-26
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多