5

次のようなcsvファイルをRに読み込んでいます:

3,3
3,2
3,3
3,3
3,3
3,3
2,3
1,2
2,2
3,3

データが持つ可能性のある 9 つの固有の可能性 (3 と 3 は 9、3 と 2 は 8、2 と 3 は 6 など) のそれぞれに番号を割り当てたいと考えています。各行を評価し、3 番目の列に数値を割り当て、データ セットの各行に対してこれを行う入れ子になった if ステートメントを設計しようとしています。これは apply 関数で実行できると思いますが、if ステートメントを apply 関数内で機能させるのに問題があります。2 つの列は両方とも 1、2、または 3 の値を取り得る。

#RScript for haplotype analysis

#remove(list=ls())
options(stringsAsFactors=FALSE)
setwd("C:/Documents and Settings/ColumbiaPC/Desktop")

#read in comma-delimited, ID-matched genotype data
OXT <- read.csv("OXTRhaplotype.csv")
colnames(OXT)<- c("OXT1","OXT2")

OXT$HAP <- apply(OXT, 1, function(x) if(x[1]=="3"&&x[2]=="3")x[3]=="9" else 0))

事前に助けてくれてありがとう。

4

4 に答える 4

11

ifステートメントなしで、マトリックスと標準の R サブセットを使用して、説明した問題を解決できます

m <- matrix(1:9, nrow=3, byrow=TRUE)
m

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

これは、行列のサブセット化を使用して m にインデックスを付けることができることを意味します。

m[3, 2]
[1] 8

m[3,3]
[1] 9

m[2,3]
[1] 6

これで、これをデータに適用できます。

df <- structure(list(V1 = c(3L, 3L, 3L, 3L, 3L, 3L, 2L, 1L, 2L, 3L), 
        V2 = c(3L, 2L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 3L)), .Names = c("V1", 
        "V2"), class = "data.frame", row.names = c(NA, -10L))

#df$m <- sapply(seq_len(nrow(df)), function(i)m[df$V1[i], df$V2[i]])
df$m <- m[as.matrix(df)]  # Use matrix subsetting, suggested by @Aaron
df

   V1 V2 m
1   3  3 9
2   3  2 8
3   3  3 9
4   3  3 9
5   3  3 9
6   3  3 9
7   2  3 6
8   1  2 2
9   2  2 5
10  3  3 9
于 2011-05-04T17:02:35.063 に答える
5

残念ながら、私は遅れて、次のような@Andrieのものと同様のソリューションを提供しました:

dat <- matrix(c(3,3,3,2,3,3,3,3,3,3,3,3,2,3,1,2,2,2,3,3), 
              nr=10, byrow=TRUE) 
# here is our lookup table for genotypes
pat <- matrix(1:9, nr=3, byrow=T, dimnames=list(1:3,1:3))

それで

> pat[dat]
 [1] 9 8 9 9 9 9 6 2 5 9

あなたが望むものを与えます。

ただし、遺伝子型データを変換/再コーディングするための機能が含まれているため、CRAN (いくつか例を挙げると、 geneticsgapまたはSNPassocなど) またはBioconductorにあるような、遺伝子研究専用のパッケージを使用する方が簡単であると思います。ハプロタイプを扱っています。

上記の発言で私が念頭に置いていることの例を次に示します。

> library(genetics)
> geno1 <- as.genotype.allele.count(dat[,1]-1)
> geno2 <- as.genotype.allele.count(dat[,2]-1)
> table(geno1, geno2)
     geno2
geno1 A/A A/B
  A/A   6   1
  A/B   1   1
  B/B   0   1
于 2011-05-04T17:28:39.860 に答える
5

アンドリーは、あなたの問題に対するより良いアプローチを示すことで、すでにあなたの質問に答えています。しかし、元のコードには、言及したいいくつかの間違いがあります。

まず、&は と同じではありません&&。詳細については、を参照?'&'してください。あなたの例で使いたかったと思い&ます。

第二に、==あなたの例で最初に正しく使用する平等のテストに使用されます。に「9」を割り当てるときに誤って使用する割り当てには使用されませんx[3]。代入は<-、関数の内部または外部に関係なく、によって処理されます。詳細については?'=='、 と を参照し?'<-'てください。

x[3]第 3 に、関数内で値を代入してapply()も意味がありません。 apply()単純に配列を返します。OXTオブジェクトは変更されません。以下は、元のアプローチがどのように見えるかの例です。ただし、おそらく Andrie の方法の方が適切です。

OXT <- read.table(textConnection(
    "3 3
    3 2
    3 3
    3 3
    3 3
    3 3
    2 3
    1 2
    2 2
    3 3"))
colnames(OXT)<- c("OXT1","OXT2")

OXT$HAP <- apply(OXT, 1, function(x)
    {
        if(x[1] == 3 & x[2] == 3) result <- 9
        else if(x[1] == 3 & x[2] == 2) result <- 8
        else if(x[1] == 3 & x[2] == 1) result <- 7
        else result <- 0
        return(result)
    })
于 2011-05-04T17:31:22.327 に答える
3

もう 1 つの方法は、2 つの列を貼り付けて因子を作成することです。

df <- structure(list(V1 = c(3L, 3L, 3L, 3L, 3L, 3L, 2L, 1L, 2L, 3L), 
        V2 = c(3L, 2L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 3L)), .Names = c("V1", 
        "V2"), class = "data.frame", row.names = c(NA, -10L))

df$hap <- factor(paste(df$V1, df$V2, sep=""))

または同等に、

df$hap2 <- factor(apply(df[1:2], 1, paste, collapse=""))
于 2011-05-04T17:37:36.137 に答える