9

アミノ酸部位のデータ フレームがあり、これらの部位のペアごとの組み合わせごとに新しいデータ フレームを作成したいと考えています。

元のデータは次のようになります。

df<-cbind(letters[1:5], letters[6:10], letters[11:15])
df
 [,1] [,2] [,3] 
[1,] "a"  "f"  "k" 
[2,] "b"  "g"  "l" 
[3,] "c"  "h"  "m" 
[4,] "d"  "i"  "n" 
[5,] "e"  "j"  "o" 

そして、私が欲しいのはこれです:

newdf<-cbind(paste(df[,1],df[,2],sep=""),paste(df[,1],df[,3],sep=""),(paste(df[,2],df[,3],sep="")))
newdf
     [,1] [,2] [,3]
[1,] "af" "ak" "fk"
[2,] "bg" "bl" "gl"
[3,] "ch" "cm" "hm"
[4,] "di" "dn" "in"
[5,] "ej" "eo" "jo"

実際のデータには何百もの行や列が含まれている可能性があるため、明らかにこれを行うには手動の方法が少なくて済みます。私は謙虚な生物学者であり、この分野でのスキルセットはかなり限られています。

4

4 に答える 4

12

と を組み合わせるとcombn()apply()順序付けされていないペアワイズ コンボがすべて得られます。

df <- cbind(letters[1:5], letters[6:10], letters[11:15])

apply(X = combn(seq_len(ncol(df)), 2), 
      MAR = 2, 
      FUN = function(jj) {
          apply(df[, jj], 1, paste, collapse="")
      }      
)
#      [,1] [,2] [,3]
# [1,] "af" "ak" "fk"
# [2,] "bg" "bl" "gl"
# [3,] "ch" "cm" "hm"
# [4,] "di" "dn" "in"
# [5,] "ej" "eo" "jo"

(上記で何が起こっているのかすぐにわからない場合は、 によって返されるオブジェクトを簡単に確認したい場合がありますcombn(seq_len(ncol(df)), 2)。その列には、1 から までのすべての順序付けられていないペアワイズ コンボ整数が列挙されます。nここで、nはデータ フレーム内の列の数です。 .)

于 2012-07-31T00:05:41.683 に答える
9

FUN引数を使用してcombn、各組み合わせの列を一緒に貼り付けることができます。

combn(ncol(df),2,FUN=function(i) apply(df[,i],1,paste0,collapse=""))
于 2012-07-31T00:36:10.300 に答える
2

ジョシュとジョシュアの答えはより良いですが、私は自分のアプローチを与えると思いました:

これには、関数を使用してqdapバージョン 1.1.0をダウンロードする必要があります。paste2

library(qdap)

ind <- unique(t(apply(expand.grid(1:3, 1:3), 1, sort)))
ind <- ind[ind[, 1] != ind[, 2], ]
sapply(1:nrow(ind), function(i) paste2(df[, unlist(ind[i, ])], sep=""))

彼らの答えから盗むために、これははるかに読みやすいでしょう:

ind <- t(combn(seq_len(ncol(df)), 2))
sapply(1:nrow(ind), function(i) paste2(df[, unlist(ind[i, ])], sep=""))
于 2012-07-31T01:24:08.830 に答える
-1

元のdata.frameに何百もの列があると仮定すると、新しいdata.frameに多くの列が含まれることに注意してください。元のデータにn列が含まれている場合、新しいデータにはn(n- 1)/2列 - これは二次的にスケーリングされます。

于 2012-07-31T06:19:29.540 に答える