5

ここに小さな例があります:

X1 <- c("AC", "AC", "AC", "CA", "TA", "AT", "CC", "CC")
X2 <- c("AC", "AC", "AC", "CA", "AT", "CA", "AC", "TC")
X3 <- c("AC", "AC", "AC", "AC", "AA", "AT", "CC", "CA")
mydf1 <- data.frame(X1, X2, X3)

入力データ フレーム

  X1 X2 X3
1 AC AC AC
2 AC AC AC
3 AC AC AC
4 CA CA AC
5 TA AT AA
6 AT CA AT
7 CC AC CC
8 CC TC CA

関数

# Function 
atgc <- function(x) {
 xlate <- c( "AA" = 11, "AC" = 12, "AG" = 13, "AT" = 14,
"CA"= 12, "CC" = 22, "CG"= 23,"CT"= 24,
 "GA" = 13, "GC" = 23, "GG"= 33,"GT"= 34,
 "TA"= 14,  "TC" = 24, "TG"= 34,"TT"=44,
"ID"= 56, "DI"= 56, "DD"= 55, "II"= 66
 )
  x =   xlate[x]
 }
outdataframe <- sapply (mydf1, atgc)
outdataframe
   X1 X2 X3
AA 11 11 12
AA 11 11 12
AA 11 11 12
AG 13 13 12
CA 12 12 11
AC 12 13 13
AT 14 11 12
AT 14 14 14

問題、AC は他の出力と同様に 11 ではなく 12 に等しくありません。ただめちゃくちゃ!

(Exta: 行名を削除する方法もわかりません。)

4

4 に答える 4

4

使用applyして転置するだけです:

t(apply (mydf1, 1, atgc))

を使用するにはsapply、次のいずれかを使用します。

  1. stringsAsFactors=FALSEデータフレームを作成するとき、つまり

    mydf1 <- data.frame(X1, X2, X3, stringsAsFactors=FALSE)
    

    (ありがとう@joran)または

  2. 関数の最後の行を次のように変更します。x = xlate[as.vector(x)]

于 2012-04-27T15:50:04.807 に答える
1

`match 関数は、「文字」クラスであるターゲット一致ベクトルで factor 引数を使用できます。

atgc <- function(fac){ c(11, 12, 13, 14, 
12, 22, 23, 24, 
13, 23, 33, 34, 
14, 24, 34,44, 
56, 56, 55, 66 )[ 
match(fac, 
  c("AA", "AC", "AG", "AT",
    "CA", "CC", "CG","CT",
    "GA", "GC", "GG","GT" ,
    "TA",  "TC", "TG","TT",
    "ID", "DI", "DD", "II") )
                ]}
#The match function returns an index that is designed to pull from a vector.
 sapply(mydf1, atgc)
     X1 X2 X3
[1,] 12 12 12
[2,] 12 12 12
[3,] 12 12 12
[4,] 12 12 12
[5,] 14 14 11
[6,] 14 12 14
[7,] 22 12 22
[8,] 22 24 12
于 2012-04-27T16:22:19.970 に答える
0

このように、マトリックス内の個々の文字の置換値を指定するだけでよく、すべての組み合わせを検討して正しく一致したことを再確認する必要はありませんが、例では組み合わせが制限されています。

値とその代替を使用してリストを定義します。

trans <- list(c("A","1"),c("C","2"),c("G","3"),c("T","4"),
  c("I","6"),c("D","5"))

を使用して置換関数を定義するgsub()

atgc2 <- function(myData, x) gsub(x[1], x[2], myData)

値が置き換えられたマトリックスを作成します(この場合、mydf1必要に応じて戻り文字値をマトリックスに変換しgsub()ますが、続行する前に、これが他のデータで機能するかどうかを確認する必要があります)

mymat <- Reduce(atgc2, trans, init = as.matrix(mydf1))

の値はmymat、元の順序のままなので"AC" = "12"、および"CA" = "21"、で並べ替えます(そして数値に変換します)

ansVec <- sapply( strsplit( mymat, split = ""),
  function(x) as.numeric( paste0( sort( as.numeric(x) ), collapse = "")))

オブジェクトansVecはベクトルなので、data.frameに変換し直します

( mydf2 <- data.frame( matrix( ansVec, nrow = nrow(mydf1) ) ) )
#   X1 X2 X3
# 1 12 12 12
# 2 12 12 12
# 3 12 12 12
# 4 12 12 12
# 5 14 14 11
# 6 14 12 14
# 7 22 12 22
# 8 22 24 12

この状況では、他の答えは間違いなく速いです。ただし、交換作業がより複雑になるにつれて、このソリューションにはいくつかの利点があると思います。ただし、このメソッドで対処できない側面の1つは、との"ATTGCG"両方の文字列をチェックすることです。"ATT""TTG"

于 2012-04-27T22:01:55.440 に答える
0

実際には、元のベクトルを因子として表現したいと思うと思います。それらは任意の文字値ではなく、レベルの有限セット (DNA ジヌクレオチド) を表すからです。

lvls = c("AA", "AC", "AG", "AT", "CA", "CC", "CG", "CT", "GA", "GC", 
         "GG", "GT", "TA", "TC", "TG", "TT", "ID", "DI", "DD", "II")
X1 <- factor(c("AC", "AC", "AC", "CA", "TA", "AT", "CC", "CC"), levels=lvls)
X2 <- factor(c("AC", "AC", "AC", "CA", "AT", "CA", "AC", "TC"), levels=lvls)
X3 <- factor(c("AC", "AC", "AC", "AC", "AA", "AT", "CC", "CA"), levels=lvls)
mydf1 <- data.frame(X1, X2, X3)

同様に、「11」は要因のレベルであり、数字の 11 ではありません。したがって、レベル間のマッピングは

xlate <- c("AA" = "11", "AC" = "12", "AG" = "13", "AT" = "14",
           "CA"= "12", "CC" = "22", "CG"= "23","CT"= "24",
           "GA" = "13", "GC" = "23", "GG"= "33","GT"= "34",
           "TA"= "14",  "TC" = "24", "TG"= "34","TT"="44",
           "ID"= "56", "DI"= "56", "DD"= "55", "II"= "66")

単一の変数を「再レベル化」する

levels(X1) <- xlate

データ フレームのすべての列のレベルを再調整するには、

as.data.frame(lapply(mydf1, `levels<-`, xlate))

という名前を付けたとしても、(文字の) マトリックスが作成されるため、使用sapplyは適切ではありませんoutdataframe。この区別は、これが表す SNP データにとって実際には重要である可能性があります。これは、マトリックスとしての 1000 のサンプルにわたる数百万の SNP が、R が格納できる最長ベクトルよりも長い長さの単一ベクトルとして実装されるためです (モジュロ ラージ ベクトルのサポートは、 R-devel)、一方、データ フレームはそれぞれ数百万の要素のみのベクトルのリストになります。

于 2012-04-28T00:53:43.337 に答える