>source

값이 반복되는 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

    기본 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= '-'))
    

  • 답변 # 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)
    

  • 이전 redirect : Ingress에서 502 오류 발생
  • 다음 windows : gcloud 서비스 계정 인증 활성화의 간헐적 오류 --최대 재시도 횟수가 WSAECONNRESET을 초과했습니다.