组合重复,不发布空白,dplyr :: distinct

时间:2016-07-24 20:30:43

标签: r dplyr

我尝试使用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,然后在冷凝后删除它并且不起作用。任何想法如何压缩行,但只保留行中的值并忽略空白?谢谢。

2 个答案:

答案 0 :(得分:4)

也许你遇到问题的原因是你应该使用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)

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

您可以编写自己的函数以提供给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

答案 1 :(得分:1)

您可以填写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