【问题标题】:combine duplicates, do not publish blanks, dplyr::distinct合并重复,不要发布空白,dplyr::distinct
【发布时间】:2016-07-24 20:30:42
【问题描述】:

我尝试使用 dplyr distinct 来组合行、删除重复项以及删除空白。这是我的数据框:

unique_id   school  subject  grade  sex
    1       great   Math      88    
    1       great   English   78    
    1       great   History   98    male
    2       spring  Math      65    
    2       spring  English   72    female
    2       spring  History   84    

当我跑步时(谢谢 Akrun):

(r2 <- df %>%
  group_by(unique_id) %>% 
  summarise_each(funs(toString(unique(.)))))

我明白了:

unique_id   school  subject                     grade       sex
    1       great   Math, English, History      88,78,98     , male 
    2       spring  English, English, History   65,72,84     , female

我不希望在最后一个变量性别中包含空格或逗号。相反,我希望它看起来如下:

unique_id   school  subject                     grade       sex
    1       great   Math, English, History      88,78,98     male   
    2       spring  English, English, History   65,72,84     female

任何尝试在导入时添加 NA,然后在压缩后将其删除,但没有成功。任何想法如何压缩行,但只保留行中的值并忽略空格?谢谢。

【问题讨论】:

  • 如果你不想要逗号,为什么要使用toString
  • 这是向我推荐的。你会建议我用什么替换它?
  • 将sex列中的空字符串替换为每个unique_id的同性别即可。
  • 使用NAs,他们在那里是有原因的。
  • 我倾向于同意 re: NAs,但在这种情况下,有了这个数据框,它们就没用了。

标签: r dplyr


【解决方案1】:

也许您遇到问题的原因是您在应该使用 NA 时使用了空字符串。这就是我认为的惯用代码。

df <- data.frame(unique_id = c(rep(1,3),rep(2,3)),
                school = c(rep('great',3),rep('spring',3)),
                           subject = rep(c("Math", "English", "History"),2),
                           grade = c(88,78,98,65,72,84),
                           sex = c(NA,NA, "male", NA, "female", NA))

r2 <- df %>%
  group_by(unique_id) %>% 
  summarise_each(funs(toString(unique(.))))

返回

# A tibble: 2 x 5
  unique_id school                subject      grade        sex
      <dbl>  <chr>                  <chr>      <chr>      <chr>
1         1  great Math, English, History 88, 78, 98   NA, male
2         2 spring Math, English, History 65, 72, 84 NA, female

你总是可以的

 r2$sex <- sapply(stringr::str_split(r2$sex, ", "),"[",2)

之后,如果您真的想要删除这些 NA,但我认为它们提供了丰富的信息。

您可以编写自己的函数来提供给summarize_each,这将允许您处理任何列中的 NA。请注意,您只需要这样做是因为 unique 没有 na.rm 参数,这是理所当然的。

rm_na_unique <- function(vec){
  unique(vec[!is.na(vec)])
}

r2 <- df %>%
       group_by(unique_id) %>% 
       summarise_each(funs(toString(rm_na_unique(.))))

给你同样的结果

# A tibble: 2 x 5
  unique_id school                subject      grade    sex
      <dbl>  <chr>                  <chr>      <chr>  <chr>
1         1  great Math, English, History 88, 78, 98   male
2         2 spring Math, English, History 65, 72, 84 female

【讨论】:

  • 感谢@sayaa。我不希望单元格中有 NA。我想忽略空格,只包括值。在顶部查看所需的最终结果。谢谢。
  • 完美运行,谢谢@sayaa。快速提问,您可以从数据框中删除所有 NA 吗?在这个特定的数据框中有超过 200 多个观察值和 30 个变量。为每个变量编写这个将非常耗时。这就是为什么我希望在组合行时可以删除空格和空格。再次感谢。
  • 再次编辑。但是,认真考虑在这种情况下使用 NA。他们不是没用的。他们告诉你,你没有每所学校所有三名学生的信息。
【解决方案2】:

您可以填写sex 列,以便其中没有空字符串,然后您的解决方案将起作用:

library(dplyr)
df %>% group_by(unique_id) %>% mutate(sex = unique(sex[sex != ""])) %>% 
       summarise_each(funs(toString(unique(.))))

# Source: local data frame [2 x 5]
# 
#   unique_id school                subject      grade    sex
#       <chr>  <chr>                  <chr>      <chr>  <chr>
# 1         1  great Math, English, History 88, 78, 98   male
# 2         2 spring Math, English, History 65, 72, 84 female

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2015-08-23
    • 2016-01-14
    相关资源
    最近更新 更多