2016-03-24 13 views
1

名前を行でソートし、別の列を作成するコンマ区切りの文字列を作成しようとしています。DataFrameで複数の列を使用してカンマ区切りの文字列を取得し、3番目の列を作成する関数を適用する

これは私のサンプルdata.frameです。ここで

lapply(df,FUN=paste(sort(df$A,df$B),collapse=" , ")) 
mapply(FUN= function(x,y)paste(sort(x,y),collapse=" , "),df$A,df$B) 

私は列の値をソートし、それらを貼り付けしようとしています:私は取得しようとしています出力は、これまでのところ、私はこれを試してみました。この

A B C 
1 A E A , E 
2 K C C , K 
3 B D B , D 
4 D A A , D 
5 F K F , K 

ようになる

df=data.frame(A=c("A","K","B","D","F"),B =c("E","C","D","A","K")) 

    A B 
1 A E 
2 K C 
3 B D 
4 D A 
5 F K 

','を使用して一意のペア名を作成します。

何か助けていただければ幸いです。

答えて

2

を試してみてください、しかし、あなたのデータが要因なので、あなたは彼らソート適切に文字を強制する必要があります。簡単にするため

df$C <- mapply(function(x, y){paste(sort(c(as.character(x), as.character(y))), 
            collapse = ',')}, df$A, df$B) 
df 
# A B C 
# 1 A E A,E 
# 2 K C C,K 
# 3 B D B,D 
# 4 D A A,D 
# 5 F K F,K 

ちょうどapplyを使って行を繰り返し処理することができます:

apply(df, 1, function(x){paste(sort(x), collapse = ',')}) 

dfを行列として扱うので、すべての文字が文字に変換されます。これは、サンプルデータに必要なものになります。

2つの列を貼り付けるためのtidyr::uniteも参照してください。ただし、簡単に並べ替えることはできません。

2

あなたはmapplyでそれを行うことができ、この

> for(i in 1:nrow(df)){ 
+  df$C[i]<-paste0(as.character(unlist(sort(df[i,1:2]))),collapse=" , ") 
+ } 
> df 
> df 
    A B  C 
1 A E A , E 
2 K C C , K 
3 B D B , D 
4 D A A , D 
5 F K F , K 
+0

適用を使用して行うことができますか。 +1 –

+0

私は@alistaireの答えがそれを信じている –

6

2列しかない場合は、コストのかかるループコードを避けるために、pmaxpminを使用できます。例:

with(lapply(df, as.character), paste(pmin(A,B),pmax(A,B),sep=",")) 
#[1] "A,E" "C,K" "B,D" "A,D" "F,K" 
関連する問題