2013-08-07 2 views
39

は、私はこれを持っている場合:データフレーム内の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 

次に、どのように私はそれがこのようになりますという名前のx、このようなことを新しい列に2列のnとを組み合わせる行います

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

答えて

54

使用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 
+0

@ thelatemail - 'ペーストを()'を使用してデータポイント間の特殊文字を追加する方法。?上記の例では、 'x'カラムは' 2-aa'、次に '3-bb'と' 5-cc'のデータを持つ必要があります。 –

+1

。@ thelatemail - これは私のために働いた: 'paste(df $ n、df $ s、sep =" - ")' –

-3

cbindも使用できます。

cbind(df,n,s) 
    n s  b n s 
1 2 aa TRUE 2 aa 
2 3 bb FALSE 3 bb 
3 5 cc TRUE 5 cc 
+0

これはOPが尋ねるものを生成しない – Ferroao

+0

cbindは連結せず、複数のデータフレームを新しいデータフレームに変換する –

5

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) 

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

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

元の質問の期待される答えを再現するために 'tidyr'パッケージを使いたい場合、これは一行です:' tidyr :: unite(df、x、n、s、sep = " "、remove = FALSE)[、c(names(df)、" x ")]]。しかし、 'df $ x < - paste(df $ n、df $ s)'がはるかに簡単なので、私はそうする理由は見当たりません。 – Uwe

+0

@Ferroaoまあ、回答はあまりにも一般的であってはいけません。そうでなければ、すべての質問にはすべてを組み込んだ巨大な答えが1つあります。 NAの削除はOPの簡単な質問の一部ではなかったので、追加の複雑さが単純な 'ペースト'や 'tidyr :: unite'の価値をどのように増やすのか分かりません。 – useR

+0

答えが手順をいくつかの列に適用することができます。この場合、NAの外観は非常に可能性があります。 – Ferroao

14

df$x <- paste(df$n,"-",df$s)を適用します。あなたが連結フィールドで導入された任意のパディングスペースを必要としない場合

+0

。@ LittleBee - これは2つのデータの間にスペースを追加します。たとえば、最終出力は 'A-B'の代わりに' A-B'のようになります。この余分なスペースを削除することは可能ですか? –

+2

。@ LittleBee - これは私のために働いた: 'paste(df $ n、df $ s、sep =" - ")' –

+1

ペーストの代わりにpaste0を使う – Ferroao

1

あなたは df$combField <- paste0(df$x,df$y)

を使用することができます。これは、2つのフィールドの組み合わせを表す一意のIDとして結合フィールドを使用する予定がある場合に、より便利です。

0

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