programing

데이터 프레임의 두 개 이상의 열을 새 이름의 새 열로 결합

itmemos 2023. 6. 26. 21:06
반응형

데이터 프레임의 두 개 이상의 열을 새 이름의 새 열로 결합

예를 들어 다음과 같은 기능이 있습니다.

n = c(2, 3, 5) 
s = c("aa", "bb", "cc") 
b = c(TRUE, FALSE, TRUE) 
df = data.frame(n, s, b)

  n  s     b
1 2 aa  TRUE
2 3 bb FALSE
3 5 cc  TRUE

그러면 두 열을 어떻게 결합합니까?n그리고.s라는 이름의 새 열에x다음과 같이 표시됩니다.

  n  s     b     x
1 2 aa  TRUE  2 aa
2 3 bb FALSE  3 bb
3 5 cc  TRUE  5 cc

사용하다paste.

 df$x <- paste(df$n,df$s)
 df
#   n  s     b    x
# 1 2 aa  TRUE 2 aa
# 2 3 bb FALSE 3 bb
# 3 5 cc  TRUE 5 cc

구분 기호를 삽입하는 경우:

df$x <- paste(df$n, "-", df$s)

이미 Uwe와 UseR의 코멘트에서 언급했듯이, 일반적인 솔루션은tidyverse형식은 명령을 사용하는 것입니다.unite:

library(tidyverse)

n = c(2, 3, 5) 
s = c("aa", "bb", "cc") 
b = c(TRUE, FALSE, TRUE) 

df = data.frame(n, s, b) %>% 
  unite(x, c(n, s), sep = " ", remove = FALSE)

사용.dplyr::mutate:

library(dplyr)
df <- mutate(df, x = paste(n, s)) 

df 
> df
  n  s     b    x
1 2 aa  TRUE 2 aa
2 3 bb FALSE 3 bb
3 5 cc  TRUE 5 cc

NA를 사용한 몇 가지 예 및 를 사용한 NA 제거

n = c(2, NA, NA) 
s = c("aa", "bb", NA) 
b = c(TRUE, FALSE, NA) 
c = c(2, 3, 5) 
d = c("aa", NA, "cc") 
e = c(TRUE, NA, TRUE) 
df = data.frame(n, s, b, c, d, e)

paste_noNA <- function(x,sep=", ") {
gsub(", " ,sep, toString(x[!is.na(x) & x!="" & x!="NA"] ) ) }

sep=" "
df$x <- apply( df[ , c(1:6) ] , 1 , paste_noNA , sep=sep)
df

붙여넣기 0:

df$combField <- paste0(df$x, df$y)

연결된 필드에 패딩 공간을 도입하지 않으려면 다음과 같이 하십시오.결합된 필드를 두 필드의 조합을 나타내는 고유 ID로 사용하려는 경우 더 유용합니다.

대신에

  • paste(기본 공백),
  • paste0(누락 포함 강제 적용)NA인물로서) 또는
  • unite(2개의 열과 1개의 분리기로 제한됨)

저는 유연한 대안을 제안하고 싶습니다.paste0하지만 좀 더 신중하게.NA:stringr::str_c

library(tidyverse)

# check the missing value!!
df <- tibble(
  n = c(2, 2, 8),
  s = c("aa", "aa", NA_character_),
  b = c(TRUE, FALSE, TRUE)
)

df %>% 
  mutate(
    paste = paste(n,"-",s,".",b),
    paste0 = paste0(n,"-",s,".",b),
    str_c = str_c(n,"-",s,".",b)
  ) %>% 

  # convert missing value to ""
  mutate(
    s_2=str_replace_na(s,replacement = "")
  ) %>% 
  mutate(
    str_c_2 = str_c(n,"-",s_2,".",b)
  )
#> # A tibble: 3 x 8
#>       n s     b     paste          paste0     str_c      s_2   str_c_2   
#>   <dbl> <chr> <lgl> <chr>          <chr>      <chr>      <chr> <chr>     
#> 1     2 aa    TRUE  2 - aa . TRUE  2-aa.TRUE  2-aa.TRUE  "aa"  2-aa.TRUE 
#> 2     2 aa    FALSE 2 - aa . FALSE 2-aa.FALSE 2-aa.FALSE "aa"  2-aa.FALSE
#> 3     8 <NA>  TRUE  8 - NA . TRUE  8-NA.TRUE  <NA>       ""    8-.TRUE

reprex 패키지(v0.3.0)에 의해 2020-04-10에 생성되었습니다.

로부터의 여분의 메모.str_c문서화

대부분의 다른 R 함수와 마찬가지로 결측값은 "감염성"입니다. 결측값이 다른 문자열과 결합될 때마다 결과는 항상 결측됩니다.사용하다str_replace_na()개종하기 위해NA로."NA"

다른 훌륭한 답변도 있지만, 미리 연결할 열 이름이나 열 수를 모르는 경우 다음과 같은 방법이 유용합니다.

df = data.frame(x = letters[1:5], y = letters[6:10], z = letters[11:15])
colNames = colnames(df) # could be any number of column names here
df$newColumn = apply(df[, colNames, drop = F], MARGIN = 1, FUN = function(i) paste(i, collapse = ""))

저는 또한 많은 수의 열을 연결하는 방법을 제안하고 싶습니다. 어니스트가 제안한 솔루션은 대규모 데이터 세트에서 매우 느릴 수 있습니다.

다음은 제가 제안한 솔루션입니다.

# setup data.frame - Making it large for the time benchmarking
n = rep(c(2, 3, 5), 1000000)
s = rep(c("aa", "bb", "cc"), 1000000)
b = rep(c(TRUE, FALSE, TRUE), 1000000) 
df = data.frame(n, s, b)

# The proposed solution:
colNames = c("n", "s") # could be any number of column names here
df$x <- do.call(paste0, c(df[,colNames], sep=" "))

# running system.time on this yields:
# user  system elapsed 
# 1.861   0.005   1.865 

# compare with alternative method:
df$x <- apply(df[, colNames, drop = F], MARGIN = 1, 
                         FUN = function(i) paste(i, collapse = ""))
# running system.time on this yields:
# user  system elapsed 
#  16.127   0.147  16.304

언급URL : https://stackoverflow.com/questions/18115550/combine-two-or-more-columns-in-a-dataframe-into-a-new-column-with-a-new-name

반응형