我有一个 data.frame,其中值在 col1
中重复。
col1 <- c("A", "A", "B", "B", "C")
col2 <- c(1995, 1997, 1999, 2000, 2005)
df <- data.frame(col1, col2)
我想将 col2
中对应于 col1
中相同字母的值组合到一个单元格中,以便 col2
显示一系列col1
中特定字母的值。为此,我将 data.frame 按 col1
拆分,应用 fun
,然后将拆分后的 data.frames 重新绑定(bind)在一起。
library(tidyverse)
split_df <- split(df, df$col1)
fun <- function(df) {
if (length(unique(df$col2)) > 1) {
df$col2 <- paste(min(df$col2),
max(df$col2),
sep = "-")
df <- distinct(df)
}
return(df)
}
split_df <- lapply(split_df, fun)
df <- do.call(rbind, split_df)
这可行,但我想知道是否有更直观或更有效的解决方案?
最佳答案
使用 aggregate
的 Base R 方式 -
aggregate(col2~col1, df, function(x) paste0(unique(range(x)), collapse = '-'))
# col1 col2
#1 A 1995-1997
#2 B 1999-2000
#3 C 2005
同样也可以用dplyr
来写-
library(dplyr)
df %>%
group_by(col1) %>%
summarise(col2 = paste0(unique(range(col2)), collapse = '-'))
关于r - 按条件将行值组合成字符向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71097343/