값이 반복되는 data.frame이 있습니다.열1
.
col1 <-c("A", "A", "B", "B", "C")
col2 <-c(1995, 1997, 1999, 2000, 2005)
df <-data.frame(col1, col2)
값을 결합하고 싶습니다.열2
의 같은 문자에 해당하는열1
하나의 세포로, 그래서열2
특정 문자에 대한 값 범위를 보여줍니다.열1
. 나는 data.frame을 다음과 같이 분할하여 이 작업을 수행합니다.열1
, 지원재미있는
, 분할된 data.frames를 다시 결합합니다.
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)
이것은 작동하지만 더 직관적이거나 더 효율적인 솔루션이 있는지 궁금합니다.
- 답변 # 1
- 답변 # 2
한 가지 옵션은 이 작업을 좀 더 간결하게 수행할 수 있는 Tidyverse입니다. 기본 아이디어는 동일합니다.
library(tidyverse) new.result <-df %>% group_by(col1) %>% summarize( col2= ifelse(n()== 1, as.character(col2), paste(min(col2), max(col2), sep= '-')) ) col1 col2 <chr> <chr>1 A 1995-1997 2 B 1999-2000 3 C 2005
다른(그러나 지나치게 복잡할 수 있음) 접근 방식에서는 그룹당 최대 2년이 있다고 가정합니다. 시작 연도와 종료 연도를 자체 열로 피벗한 다음 직접 붙여넣을 수 있습니다. 이를 위해서는 데이터 변환이 조금 더 필요하지만 1년이 있는 그룹을 명시적으로 확인할 필요가 없습니다.
df %>% group_by(col1) %>% mutate(n= row_number()) %>% pivot_wider(names_from= n, values_from= col2) %>% rowwise() %>% mutate( vec= list(c(`1`, `2`)), col2= paste(vec[!is.na(vec)], collapse= '-') ) %>% select(col1, col2)
기본 R 방식 사용
골재
-다음과 같이 작성할 수도 있습니다.
dplyr
-