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


104

예를 들어 다음과 같은 경우 :

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

답변:


129

사용 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

. @ thelatemail- paste()?를 사용하여 데이터 포인트 사이에 특수 문자를 추가하는 방법은 무엇입니까? 위의 예에서 x열에는 2-aa, 3-bb및으로 데이터가 있어야합니다 5-cc.
Chetan Arvind Patil

8
. @ thelatemail - 이것은 나를 위해 일한 :paste(df$n,df$s,sep="-")
Chetan에 아빈 파틸

2
열에 sNA 값이 있으면 어떻게 NA를 생략 할 수 있습니까? (내가보고 싶어하지 않는 3 NA경우를 df$s[2]=NA)
치나

34

구분 기호 삽입 :

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

1
. @ LittleBee-두 데이터 사이에 공백을 추가합니다. : 예를 들어, 최종 출력은 같다 A - B대신 A-B. 이 추가 공간을 제거 할 수 있습니까?
Chetan Arvind Patil

8
. : - @ LittleBee 이것은 나를 위해 일한paste(df$n,df$s,sep="-")
Chetan에 아빈 파틸

5
paste 대신 paste0 사용
Ferroao

3
이것은 원하는 출력을 제공하지 않습니다 : OP는 다른 구분 기호가 아닌 요소 사이에 공백을 요청합니다 (그런데 sep인수 로 더 잘 놓일 것입니다 ...). 귀하의 답변보다 거의 4 년 전에 게시 된 다른 답변은 질문에 대한 완벽한 답변입니다.
Cath

16

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)

2
이 예에서 x는 무엇입니까?
Levi

x결합 된 값을 포함하는 새 열의 이름 을 나타내는 @Levi . dplyr의 생각 mutate:df %>% dplyr::mutate(x = "your operations")
Vesanen

13

NAs 및 적용을 사용하여 제거하는 몇 가지 예

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

2
tidyr패키지 를 사용하여 원래 질문의 예상 답변을 재현하려면 한 줄짜리 : tidyr::unite(df, x, n, s, sep = " ", remove = FALSE)[, c(names(df), "x")]. 그러나 그렇게하는 이유 df$x <- paste(df$n,df$s)는 훨씬 간단 하지 않습니다 .
Uwe

@Ferroao 글쎄요, 대답도 너무 일반적이어서는 안됩니다. 그렇지 않으면 모든 질문에 모든 것을 통합하는 하나의 거대한 대답이있을 것입니다. NA의 제거는 OP의 간단한 질문의 일부가 아니 었으므로 추가 복잡성이 어떻게 단순 paste또는 tidyr::unite.
avid_useR

@Ferroao 감사합니다, 당신은 내 생명을 구했습니다. pls는 paste_noNA 함수를 df $ x <-적용 전에 이동합니다.
malajisi

11

사용 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

1
아니요, 이미 기존 답변이므로 mutate가 아닌 paste를 사용하고 있습니다 .
zx8754

.NET Framework의 일부로 열을 결합하는 방법을 시연하고 있다고 생각했습니다 dplyr::mutate(). 죄송합니다. 도움을 주려고 노력하는 것뿐입니다. 더 이상 사이트를 오염시키지 않고 향후 게시를 삼가하겠습니다.
sbha

무례하게 나온다면 죄송합니다. OP의 문제는 mutate 를 사용하여 해결되지 않으며 질문은 dplyr 을 사용 하는 방법이 아니라 열 값을 결합하는 방법에 관한 것입니다. 나는 단순히 그들이 mutate 가 아닌 paste 가 필요하다는 것을 지적하고 있습니다. dplyr을 올바르게 보여주고 싶다면 unite 함수를 사용하는 것 입니다.
zx8754

9

paste0 사용할 수 있습니다 .

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

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


6

대신에

  • 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 패키지에 의해 2020-04-10에 생성됨 (v0.3.0)에

str_c문서의 추가 참고

대부분의 다른 R 함수와 마찬가지로 누락 된 값은 "감염성"입니다. 누락 된 값이 다른 문자열과 결합 될 때마다 결과가 항상 누락됩니다. 사용 str_replace_na()변환에 NA"NA"


1
paste0(n,"-",s,".",b)그리고 str_c(n,"-",s,".",b)둘은 빈 문자열 기본 구분 기호를 사용하여 정확히 동일합니다 ''. 나는 또한 왜 paste"정리" 인지 모르겠다 . 당신은 당신이 공백을 좋아하지 않는다는 것을 의미합니까?
Axeman

paste0str_c정확하게 동일하지 않습니다. 다음 링크를 살펴보십시오. (1) rdocumentation.org/packages/stringr/versions/1.3.1/topics/str_c (2) stackoverflow.com/questions/53118271/…
avallecam

아 그렇군요! 감사! 그들이 어떻게 str_c다른지이 답변에 좋은 추가가 될 것입니다 (그리고 문서도 더 설명 적 일 수 있습니다!).
Axeman

@Axeman 귀하의 제안에 감사드립니다. 나는 대답을 단순화 플러스 문제에 대한 추가 참고 추가 한
avallecam을

2

다른 좋은 답변이 있지만 미리 연결하려는 열 이름이나 열 수를 모르는 경우 다음이 유용합니다.

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 = ""))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.