我找不到这个问题的确切答案,所以我希望我没有重复问题。
我有一个数据框如下
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/