如何根据Column中的值将行合并到R中的一行

时间:2017-03-30 08:28:55

标签: r

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:这是我的第一篇文章,所以我希望它足够丰富。

2 个答案:

答案 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_eachna.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