【问题标题】:Combine rows by group with differing NAs in each row按组组合行,每行具有不同的 NA
【发布时间】:2017-12-25 09:07:23
【问题描述】:

我找不到这个问题的确切答案,所以我希望我没有重复问题。

我有一个如下的数据框

groupid  col1  col2  col3  col4
   1      0     n     NA     2    
   1      NA    NA    2      2

我想要传达的是,存在重复的 ID,其中总信息分布在两行中,我想将这些行组合起来以将所有信息集中到一行中。我该怎么办?

我尝试过使用 group_by 并粘贴,但最终导致数据更混乱(例如,在 col4 中得到 22 而不是 2)并且 sum() 不起作用,因为有些列是字符串而那些不是是分类变量,将它们相加会改变信息。

在填写 NA 时,我可以做些什么来折叠行并保持一致的数据不变?

编辑:

抱歉,想要的输出如下:

groupid  col1  col2  col3  col4
   1      0     n     2     2

【问题讨论】:

标签: r grouping


【解决方案1】:

在这种情况下你能画出想要的输出吗?将 data.frame 转换为另一种类型 as.vector()、as.matrix() 和分组/分解可能会有所帮助。

更新: 为每列查找唯一元素并省略 NA。

df<-data.frame(groupid=c(1,1), col1=c(0,NA), col2=c('n', NA), col3=c(NA,2),  col4=c(2,2)) # your input
out<-data.frame(df[1,]) # where the output is stored, duplicate retaining 1 row
for(i in 1:ncol(df)) out[,i]<-na.omit(unique(df[,i]))
print(out)

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 我昨天没有发表评论的权限。这是我能做的。有必要澄清这个问题,我所做的一切都是合乎道德的。
  • 那你现在就做,去掉这个答案。
  • 答案已更新,无需删除。正如我所说,评论是不可能的,为此道歉。
【解决方案2】:

这是你想要的吗? zoo+dplyr 也可以在这里查看link

df %>%
    group_by(groupid) %>%
    mutate_all(funs(na.locf(., na.rm = FALSE, fromLast = FALSE)))%>%filter(row_number()==n())


# A tibble: 1 x 5
# Groups:   groupid [1]
  groupid  col1  col2  col3  col4
    <int> <int> <chr> <int> <int>
1       1     0     n     2     2

EDIT1

没有过滤器,将返回整个数据帧。

    df %>%
        group_by(groupid) %>%
        mutate_all(funs(na.locf(., na.rm = FALSE, fromLast = FALSE)))

# A tibble: 2 x 5
# Groups:   groupid [1]
  groupid  col1  col2  col3  col4
    <int> <int> <chr> <int> <int>
1       1     0     n    NA     2
2       1     0     n     2     2

filter 这里,只切最后一个,na.locf 会继承前一个而不是NA 的值,这意味着你组中的最后一行就是你想要的。

同样基于@thelatemail 推荐。您可以执行以下操作,返回相同的答案。

df %>% group_by(groupid) %>% summarise_all(funs(.[!is.na(.)][1]))

EDIT2

假设你有冲突并且你想把它们都展示出来。

df <- read.table(text="groupid  col1  col2  col3  col4
   1      0     n     NA     2    
                 1      1    NA    2      2",
                 header=TRUE,stringsAsFactors=FALSE)
 df
  groupid col1 col2 col3 col4
1       1    0    n   NA    2
2       1    1(#)<NA>    2    2(#)
df %>%
    group_by(groupid) %>%
    summarise_all(funs(toString(unique(na.omit(.)))))#unique for duplicated like col4
  groupid  col1  col2  col3  col4
    <int> <chr> <chr> <chr> <chr>
1       1  0, 1     n     2   2

【讨论】:

    【解决方案3】:

    只有dplyr 的另一个选项是在可用时取第一个非 NA 值。你可以这样做

    dd <- read.table(text="groupid  col1  col2  col3  col4
    1      0     n     NA     2    
    1      NA    NA    2      2", header=T)
    
    dd %>% 
      group_by(groupid) %>% 
      summarise_all(~first(na.omit(.)))
    

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 2019-08-12
      • 1970-01-01
      • 2019-09-11
      • 2021-11-15
      • 1970-01-01
      • 2021-09-12
      • 2018-07-12
      • 1970-01-01
      相关资源
      最近更新 更多