使用R中的字符串值聚合行

使用R中的字符串值聚合行,r,aggregate,R,Aggregate,我有一个数据帧df,只有string值。我需要在id和session上聚合这些行,并填充NA值。我的原始数据帧有50列,但这只是一个示例数据帧。您可以假设对于id和session的每个组合,如果没有NA值,则值(string1或string2)是相同的 session <- c('s1', 's1', 's1', 's2', 's2', 's2') string1 <- c('first_string1', NA, 'first_string1', NA, 'first_string

我有一个数据帧
df
,只有
string
值。我需要在
id
session
上聚合这些行,并填充
NA
值。我的原始数据帧有50列,但这只是一个示例数据帧。您可以假设对于
id
session
的每个组合,如果没有NA值,则值(string1或string2)是相同的

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>

我曾尝试使用聚合函数,但我不知道如何使其工作有点笨重,但有效:

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
id会话string1 string2
1一根s1第一根线1第二根线2
2 b s2第一排3第二排4

使用
aggregate
可以执行类似操作,其中包括一个函数,该函数在聚合时删除NAs并查找唯一行:

aggregate(df[c(“string1”、“string2”)],
by=列表(id=id,session=session),
函数(x)唯一(na.省略(x)))
####输出####
id会话string1 string2
1一根s1第一根线1第二根线2
2 b s2第一排3第二排4
Base R的合并是另一个可能稍微容易理解的选项:

unique(na.omit(merge)(df[c(“id”,“session”,“string1”))),
df[c(“id”、“会话”、“字符串2”)],
by=c(“id”,“会话”)
)))
####输出
id会话string1 string2
1一根s1第一根线1第二根线2
2 b s2第一排3第二排4
另一个选项是:

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


假设在起始数据帧中的任何位置都不相邻,那么将
first\u string3
second\u string4
关联的逻辑是什么?它们都具有相同的
id
session
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

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