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