데이터 프레임의 두 개 이상의 열을 새 이름의 새 열로 결합
예를 들어 다음과 같은 기능이 있습니다.
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
'programing' 카테고리의 다른 글
| Git에서 특정 사용자의 커밋을 찾는 방법은 무엇입니까? (0) | 2023.06.26 |
|---|---|
| Firebase 새로 고침 사용 방법재인증을 위한 토큰? (0) | 2023.06.26 |
| "삭제 캐스케이드" 제약 조건을 추가하는 방법은 무엇입니까? (0) | 2023.06.26 |
| Docker 볼륨을 사용한 WP-CLI 파일 권한 문제 (0) | 2023.06.26 |
| 내보낸 Firebase 메시징 서비스 구현에 대한 안드로이드 린트 불만을 해결하는 방법은 무엇입니까? (0) | 2023.06.26 |