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

我有一个数据框如下

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

最佳答案

这是你想要的吗 ? 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

编辑1

没有过滤器,将返回整个数据帧。
    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 将保留之前的 not NA 值,这意味着您的组中的最后一行是您想要的。

也基于@thelatemail 推荐。您可以执行以下操作,返回相同的答案。
df %>% group_by(groupid) %>% summarise_all(funs(.[!is.na(.)][1]))

编辑2

假设你有冲突并且你想把它们都展示出来。
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

关于r - 按组合并行,每行具有不同的 NA,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45201654/

10-14 07:32