Firstoff我尝试在stackoverflow上寻找解决方案。我可能错过了它,但我无法找到或编制代码来执行以下操作:
我想基于X1列将没有NA&#的行合并到一行。
X1 Sex Age Language
1487252709 NA 22 NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 male NA NA
1487252709 NA NA Nederlands
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252715 NA 32 NA
1487252715 NA NA NA
1487252715 NA NA NA
1487252715 male NA NA
1487252715 NA NA Nederlands
我的最终结果应该显示如下:
1487252709 male 22 Nederlands
1487252715 male 32 Nederlands
应该很简单吧?我想我过度思考或者其他什么,但我无法解决这个问题。我尝试了不同的功能,如rbind和merge,但它没有给出我想要的结果。
ps:这是我的第一篇文章,所以我希望它足够丰富。
答案 0 :(得分:2)
为了完整起见(并且因为这个问题已成为欺骗目标),这里也是一个data.table
解决方案:
library(data.table)
setDT(df1)[, lapply(.SD, na.omit), by = X1]
X1 Sex Age Language 1: 1487252709 male 22 Nederlands 2: 1487252715 male 32 Nederlands
此解决方案返回OP提供的样本数据集的预期答案。
但是,如果更真实的数据集可能包含重复行或仅提供NA
值,则会失败,例如,
setDT(df2)[, lapply(.SD, na.omit), by = X1]
X1 Sex Age Language 1: 1487252709 male 22 Nederlands 2: 1487252715 male 32 Nederlands 3: 1487252715 male 32 Nederlands 4: 1111111111 male NA NA 5: 1111111111 male NA NA
警告讯息:在
[.data.table
(setDT(df2),lapply(.SD,na.omit)中, by = X1):对于组3,j的结果的项目2是零长度。这个 将填充2个NAs以匹配此结果中的最长列。 后来的组可能有类似的问题,但只报告了第一组 保存填充警告缓冲区。
请注意,dplyr
解决方案会在这种情况下引发错误:
df2 %>%
group_by(X1) %>%
summarise_all(funs(na.omit))
summarise_impl(.data,dots)中的错误:列
Sex
必须是长度 1(摘要值),而不是2
为了覆盖这些边缘情况,需要修改聚合函数:
df2[, lapply(.SD, function(x) first(na.omit(x))), by = X1]
X1 Sex Age Language 1: 1487252709 male 22 Nederlands 2: 1487252715 male 32 Nederlands 3: 1111111111 male NA NA 4: 9999999999 NA NA NA
OP提供的数据集:
library(data.table)
df1 <- fread(
"X1 Sex Age Language
1487252709 NA 22 NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 male NA NA
1487252709 NA NA Nederlands
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252709 NA NA NA
1487252715 NA 32 NA
1487252715 NA NA NA
1487252715 NA NA NA
1487252715 male NA NA
1487252715 NA NA Nederlands"
)
更现实,&#34;不整洁&#34;数据集:
df2 <- fread(
"X1 Sex Age Language
1487252709 NA 22 NA
1487252709 NA NA NA
1487252709 male NA NA
1487252709 NA NA Nederlands
1487252709 NA NA NA
1487252709 NA NA NA
1487252715 NA 32 NA
1487252715 NA NA NA
1487252715 NA NA NA
1487252715 male NA NA
1487252715 NA NA Nederlands
1487252715 NA NA Nederlands
1111111111 male NA NA
1111111111 male NA NA
9999999999 NA NA NA"
)
答案 1 :(得分:1)
我们可以在{X1'
分组后使用summarise_each
和na.omit
library(dplyr)
df1 %>%
group_by(X1) %>%
summarise_each(funs(na.omit))
# A tibble: 2 × 4
# X1 Sex Age Language
# <int> <chr> <int> <chr>
#1 1487252709 male 22 Nederlands
#2 1487252715 male 32 Nederlands
正如@Uwe所说,summarise_each
将被弃用,因此请使用summarise_all