我有一个看起来像这样的小标题:
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 函数已被弃用?
谢谢您的帮助!
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"))
这是一个基本的 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