簡體   English   中英

用R中的字符串值聚合行

[英]Aggregate rows with string values in R

我有一個僅包含string值的數據框df 我需要在idsession上聚合這些行,並填充NA值。 我的原始數據框有50列,但這只是一個示例數據框。 您可以假定,對於idsession的每種組合,如果它們沒有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM