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


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

次に、どのように私は2つの列を結合しないnsという名前の新しい列にx、それはこのようになりますよう:

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

回答:


127

を使用し 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、then 3-bb、および5-ccです。
Chetan Arvind Patil 2017年

8
。@ thelatemail-これは私にとってうまくいきました:paste(df$n,df$s,sep="-")
Chetan Arvind Patil

2
sにNA値がある場合、どのようにNAを省略できますか?(私が見て好きではない3 NA場合df$s[2]=NA
シーナ

34

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

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

1
。@ LittleBee-2つのデータの間にスペースを追加します。たとえば、最終出力は次のようA - BになりA-Bます。この余分なスペースを削除することは可能ですか?
Chetan Arvind Patil 2017年

8
。@ LittleBee-これでうまくいきました:paste(df$n,df$s,sep="-")
Chetan Arvind Patil

5
pasteの代わりにpaste0を使用
Ferroao

3
これは望ましい出力を与えません。OPは、要素間にスペースを要求します。別のセパレーターは要求しません(ところで、これはsep引数として配置した方がよいでしょう...)。もう1つの回答は、あなたの回答のほぼ4年前に投稿されたものですが、質問に完全に答えています。
キャス

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

@Levi x。これは、結合された値を含む新しい列の名前を表します。dplyrのを考えるmutatedf %>% dplyr::mutate(x = "your operations")
Vesanen

13

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

2
tidyrパッケージを使用して元の質問の予想される回答を再現する場合、これは1行tidyr::unite(df, x, n, s, sep = " ", remove = FALSE)[, c(names(df), "x")]です:。ただし、その理由はわかりませんdf$x <- paste(df$n,df$s)
Uwe

@Ferroaoまあ、答えも一般的すぎてはいけません。さもなければ、すべての質問はすべてを組み込んだ1つの巨大な答えを持つだけです。NAの削除はOPの単純な質問の一部ではなかったので、その余分な複雑さがどのように単純pasteまたはに値を追加するかはわかりませんtidyr::unite
avid_useR 2017

@Ferroaoありがとう、あなたは私の命を救った。plsはpaste_noNA関数をdf $ x <-applyの前に移動します。
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

列をの一部として組み合わせる方法をデモしていると思いましたdplyr::mutate()。申し訳ありませんが、役に立てるように努力しているだけです。サイトを汚染したり、今後の投稿を控えたりすることはありません。
sbha

失礼として出た場合は申し訳ありません。OPの問題は、使用することにより解決されていないのmutateを、質問が使用する方法に関するものではありませんdplyrが、列の値を組み合わせる方法。私は単に、彼らが必要と指摘していて貼り付けていないのmutatedplyrをデモンストレーションしたい場合、正しい方法は関数uniteを使用することです。
zx8754

9

paste0を使用できます。

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

連結フィールドにパディングスペースを導入したくない場合。これは、2つのフィールドの組み合わせを表す一意の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

2020-04-10にreprexパッケージ(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.