web-dev-qa-db-ja.com

データフレーム内の2つ以上の列を新しい名前の新しい列に結合する

例えば私がこれを持っているならば:

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

それでは、2つの列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
79
user2654764

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
96
mnel

セパレータを挿入する場合

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

NAを使ったいくつかの例とapplyを使ったそれらの削除

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
9
Ferroao

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)
8
Quentin Perrier

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
7
sbha

pasteを使うことができます。

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

連結フィールドに埋め込みスペースを入れたくない場合。これは、結合フィールドを2つのフィールドの組み合わせを表す一意のIDとして使用することを計画している場合にさらに便利です。

5
yanes

の代わりに

  • paste(整頓されていない)
  • paste0(デフォルトの区切り記号)または
  • unite(2列1セパレータに制限)

もっと柔軟な代替手段をお勧めします。stringr::str_c

library("tidyverse")
df %>% mutate(x=str_c(n,"-",s,".",b))
#> # A tibble: 3 x 4
#>       n s     b     x         
#>   <dbl> <fct> <lgl> <chr>     
#> 1     2 aa    TRUE  2-aa.TRUE 
#> 2     3 bb    FALSE 3-bb.FALSE
#> 3     5 cc    TRUE  5-cc.TRUE 
4
avallecam