使用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