[英]Aggregate rows with string values in R
我有一個僅包含string
值的數據框df
。 我需要在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>
最終數據框應如下所示:
id session string1 string2
1 a s1 first_string1 second_string2
2 b s2 first_string3 second_string4
我試圖使用聚合函數,但我不知道如何使它起作用
使用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
另一個選擇是:
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
有點笨拙,但可以:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.