我有一个数据框df
,只有string
个值。我需要在id
和session
上汇总这些行,并填充NA
的值。我的原始数据框有50列,但这只是一个示例数据框。您可以假设,对于id
和session
的每种组合,如果它们没有NA值,则它们的值(字符串1或字符串2)是相同的。
session <- c('s1', 's1', 's1', 's2', 's2', 's2')
string1 <- c('first_string1', NA, 'first_string1', NA, 'first_string3', NA)
string2 <- c(NA, 'second_string2', 'second_string2', 'second_string4', NA, NA)
df <- data.frame(id, session, string1, string2)
df
id session string1 string2
1 a s1 first_string1 <NA>
2 a s1 <NA> second_string2
3 a s1 first_string1 second_string2
4 b s2 <NA> second_string4
5 b s2 first_string3 <NA>
6 b s2 <NA> <NA>
最终数据框应如下所示:
id session string1 string2
1 a s1 first_string1 second_string2
2 b s2 first_string3 second_string4
我试图使用聚合函数,但是我不知道如何使它起作用
答案 0 :(得分:2)
使用aggregate
,您可以执行以下操作,其中包括一个删除NA并在聚合时查找唯一行的函数:
aggregate(df[c("string1", "string2")],
by = list(id = id, session = session),
function(x) unique(na.omit(x)))
#### OUTPUT ####
id session string1 string2
1 a s1 first_string1 second_string2
2 b s2 first_string3 second_string4
Base R的merge
是另一个可能更容易理解的选项:
unique(na.omit(merge(df[c("id", "session", "string1")],
df[c("id", "session", "string2")],
by = c("id", "session")
)))
#### OUTPUT ####
id session string1 string2
1 a s1 first_string1 second_string2
2 b s2 first_string3 second_string4
答案 1 :(得分:1)
另一个选择是:
library(dplyr)
df %>%
group_by(id, session) %>%
summarise_at(vars(starts_with("string")), ~unique(na.omit(.)))
# A tibble: 2 x 4
# Groups: id [2]
id session string1 string2
<chr> <chr> <chr> <chr>
1 a s1 first_string1 second_string2
2 b s2 first_string3 second_string4
基本的R解决方案
aggregate(cbind(string1, string2) ~ id + session, data = df, function(x) unique(na.omit(x)), na.action = na.pass)
id session string1 string2
1 a s1 first_string1 second_string2
2 b s2 first_string3 second_string4
答案 2 :(得分:0)
有些笨拙,但是可以工作:
library(tidyverse)
df %>%
group_by (id, session) %>%
summarise(string1 = paste(unique(string1[!is.na(string1)]), collapse = ""),
string2 = paste(unique(string2[!is.na(string2)]), collapse = ""))
输出:
id session string1 string2
<fct> <fct> <chr> <chr>
1 a s1 first_string1 second_string2
2 b s2 first_string3 second_string4