通过 id 连接列中的字符串

问题描述 投票:0回答:2

我有一个看起来像这样的小标题:

  dep_code dep_color message               
    <chr>        <int> <chr>                 
  1 10               1  One                  
  2 10               1  NA                   
  3 10               1  Two                  
  4 10               1  NA                   
  5 10               1  Four                
  6 10               1  NA                   
  7 11               1  NA                   
  8 11               1  Three                  
  9 11               1  NA                   
 10 11               1  NA                   
 11 11               1  NA                   
 12 11               1  NA                   
 13 12               1  NA                   
 14 12               1  NA                   
 15 12               1  NA                   
 16 12               1  NA                   
 17 12               1  NA                   
 18 12               1  NA

如您所见,它看起来像是长数据。我想扩大它,但同时连接每个 id 的消息列中包含的字符串。如果我可以用自定义消息填充空单元格,那就太好了。它最终会看起来像这样:

  dep_code dep_color message               
    <chr>        <int> <chr>                 
  1 10               1  OneTwoFour
  2 11               1  Three                   
  3 12               1  No message

知道我该怎么做吗?我查看了各种函数,但发现没有一个函数可以处理这个问题。

尝试过 summarise 和pivot_wider 等函数。我不确定它们是否适合这类事情,或者我是否还不知道如何很好地使用它们。我一直在寻找在这里,但没有成功。看起来(看似有用的)summary 函数已被弃用?

谢谢您的帮助!

r data-cleaning
2个回答
2
投票
library(dplyr)
quux |>
  summarize(
    message = paste(na.omit(message), collapse=""), .by=c(dep_code, dep_color),
    message = if_else(nzchar(message), message, "No message")
  )
#   dep_code dep_color    message
# 1       10         1 OneTwoFour
# 2       11         1      Three
# 3       12         1 No message

数据

quux <- structure(list(dep_code = c(10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L), dep_color = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), message = c("One", NA, "Two", NA, "Four", NA, NA, "Three", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"))

0
投票

这是一个基本的 R 解决方案:

df <- split(df, df$dep_code) |>
    lapply(FUN = function(x) {
        messages <- paste(na.omit(x$message), collapse = "")
        
        if (messages == "") {
            messages <- "No Message"
        }
        
        data.frame(
            dep_code = unique(x$dep_code),
            dep_color = unique(x$dep_color),
            message = messages
        )
    })

do.call(rbind, df)

结果:

   dep_code dep_color    message
10       10         1 OneTwoFour
11       11         1      Three
12       12         1 No Message
© www.soinside.com 2019 - 2024. All rights reserved.