2

私はこのようなデータフレーム(.txt)を持っています[ここで、「dayX」=ショウジョウバエの生存アッセイでの死亡日、その下の数字は、その日にその治療の組み合わせで死亡するハエの数、XまたはAですm と f も処理です。最初の数字は行、2 番目の数字はブロックです]

    line    day1    day2    day3    day4    day5
1   Xm1.1   0   0   0   2   0
2   Xm1.2   0   0   1   0   0
3   Xm2.1   1   1   0   0   0
4   Xm2.2   0   0   0   3   1
5   Xf1.1   0   3   0   0   1
6   Xf1.2   0   0   1   0   0
7   Xf2.1   2   0   2   0   0
8   Xf2.2   1   0   1   0   0
9   Am1.1   0   0   0   0   2
10  Am1.2   0   0   1   0   0
11  Am2.1   0   2   0   0   1
12  Am2.2   0   2   0   0   0
13  Af1.1   3   0   0   1   0
14  Af1.2   0   1   3   0   0
15  Af1.1   0   0   0   1   0
16  Af2.2   1   0   0   0   0

R->を使用してこれになりたい

    XA  mf  line    block   individual  age
1   X   m   1   1   1   4
2   X   m   1   1   2   4
3   X   m   1   2   1   3

等々...

結果のデータフレームは、個人が死亡した日から「年齢」値を収集します。これは、上部のデータフレームでスコア化されたものです。たとえば、治療 Xm1.1 で 4 日目 (day4) に死亡したハエが 2 匹いたため、R は 2 つの行を作成します。最初の個人に関して抽出された情報を含み、したがって個人「1」としてラベル付けされ、次に個人「2」としてラベル付けされていることを除いて同じ情報を持つ別の行.. 3 番目の個人が 5 日目に同じ治療で死亡した場合、 3 行目は、「年齢」が「5」、個人が「3」であることを除いて、上記の 2 つの行と同じです。次の治療行 (この場合は Xm1.2) に進むと、その治療セット内で死亡した最初の個体は個体「1」とラベル付けされます。(この場合、3日目に死亡します)。私の例では、合計 38 の死亡があるため、R に 38*6 (ヘッダーを除く) の df を構築させようとしています。

私のデータフレームを取得する方法はありますか [実際のバージョンは約 50*640 で、X/A、m/f、ライン (1:40)、ブロック (1-4) の一意の組み合わせごとに約 50 人なので、約 32000 人です。死亡] 自動化された方法で 6*~32000 のデータフレームを終了しますか?

これらのサンプル データフレームは両方とも、ソリューションを試すのに役立つ場合は、このコードを使用して構築できます。

test<-data.frame(1:16);colnames(test)=("line")
test$line=c("Xm1.1","Xm1.2","Xm2.1","Xm2.2","Xf1.1","Xf1.2","Xf2.1","Xf2.2","Am1.1","Am1.2","Am2.1","Am2.2","Af1.1","Af1.2","Af2.1","Af2.2")
test$day1=rep(0,16);test$day2=rep(0,16);test$day3=rep(0,16);test$day4=rep(0,16);test$day5=rep(0,16)
test$day4[1]=2;test$day3[2]=1;test$day2[3]=1;test$day4[4]=3;test$day5[5]=1;
test$day3[6]=1;test$day1[7]=2;test$day1[8]=1;test$day5[9]=3;test$day3[10]=1;
test$day2[11]=2;test$day2[12]=2;test$day4[13]=1;test$day3[14]=3;test$day4[15]=1;
test$day1[16]=1;test$day3[7]=2;test$day3[8]=1;test$day2[5]=3;test$day1[3]=1;
test$day5[11]=1;test$day5[9]=2;test$day5[4]=1;test$day1[13]=3;test$day2[14]=1;

test2=data.frame(rep(1:3),rep(1:3),rep(1:3),rep(1:3),rep(1:3),rep(1:3))
colnames(test2)=c("XA","mf","line","block","individual","age")
test2$XA[1]="X";test2$mf[1]="m";test2$line[1]=1;test2$block[1]=1;test2$individual[1]=1;test2$age[1]=4;
test2$XA[2]="X";test2$mf[2]="m";test2$line[2]=1;test2$block[2]=1;test2$individual[2]=2;test2$age[2]=4;
test2$XA[3]="X";test2$mf[3]="m";test2$line[3]=1;test2$block[3]=2;test2$individual[3]=1;test2$age[3]=3;



睡眠不足と時差ぼけに悩まされ、R を何ヶ月も使用していないため、このダミー データセットを作成するのに非常に長い道のりを経たことをお詫びします。R でコードを実行すると、私の目的がよくわかると思います。

-------------------------------------------------- -----------------------------------

Rg255: 現在、@Arun の回答から派生した this でスタックしています ( 1 つのエラーを回避するためにstrsplit (as.character(dt$line) , "" ))セクションを追加しました)

df=read.table("C:\\Users\\...\\data.txt",header=T)
require(data.table)
head(df[1:20])
dt <- as.data.table(df)
dt <- dt[, {dd <- unlist(.SD, use.names = FALSE); 
            list(individual = sequence(dd[dd>0]), 
                 age = rep(which(dd>0), dd[dd>0])
            )}, by=line]
out <- as.data.table(data.frame(do.call(rbind, strsplit(as.character(dt$line), ""))[, c(1:3,5)], stringsAsFactors=FALSE))
setnames(out, c("XA", "mf", "line", "block"))
out[, `:=`(line = as.numeric(line), block = as.numeric(block))]
out <- cbind(out, dt[, list(individual, age)])

次の出力が生成されます。

     > df=read.table("C:\\Users\\..\\data.txt",header=T)
        > require(data.table)
        > head(df[1:20])
           line Day4 Day6 Day8 Day10 Day12 Day14 Day16 Day18 Day20 Day22 Day24 Day26 Day28 Day30 Day32 Day34 Day36 Day38 Day40
        1 Xm1.1    0    0    0     0     0     0     0     0     0     0     0     0     0     1     0     0     1     4     2
        2 Xm2.1    0    0    0     0     0     0     0     0     0     2     0     0     0     1     2     1     0     2     0
        3 Xm3.1    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     2     1
        4 Xm4.1    0    0    0     0     0     0     0     0     0     0     0     0     1     1     0     1     2     3     8
        5 Xm5.1    0    0    0     0     0     0     0     0     0     0     0     0     0     2     2     3     3     3     6
        6 Xm6.1    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1


> dt <- as.data.table(df)
        > dt <- dt[, {dd <- unlist(.SD, use.names = FALSE); 
        +             list(individual = sequence(dd[dd>0]), 
        +                  age = rep(which(dd>0), dd[dd>0])
        +             )}, by=line]
        > out <- as.data.table(data.frame(do.call(rbind, strsplit(as.character(dt$line), ""))[, c(1:3,5)], stringsAsFactors=FALSE))

        Warning message:
            In function (..., deparse.level = 1)  :
              number of columns of result is not a multiple of vector length (arg 1)


    > setnames(out, c("XA", "mf", "line", "block"))
        > out[, `:=`(line = as.numeric(line), block = as.numeric(block))]


    Error in `[.data.table`(out, , `:=`(line = as.numeric(line), block = as.numeric(block))) : 
          LHS of := must be a single column name, when with=TRUE. When with=FALSE the LHS may be a vector of column names or positions.
        In addition: Warning message:
        In eval(expr, envir, enclos) : NAs introduced by coercion


    > out <- cbind(out, dt[, list(individual, age)])
        > 
4

1 に答える 1

0

ここにdata.table解決策があります。line列には一意の値が必要です。

require(data.table)
df <- read.table("data.txt", header=TRUE, stringsAsFactors=FALSE)
dt <- as.data.table(df)
dt <- dt[, {dd <- unlist(.SD, use.names = FALSE); 
                list(individual = sequence(dd[dd>0]), 
                age = rep(which(dd>0), dd[dd>0])
                )}, by=line]
out <- as.data.table(data.frame(do.call(rbind, 
        strsplit(gsub("([[:alpha:]])([[:alpha:]])([0-9]+)\\.([0-9]+)$", 
        "\\1 \\2 \\3 \\4", dt$line), " ")), stringsAsFactors=FALSE))
setnames(out, c("XA", "mf", "line", "block"))
out[, `:=`(line = as.numeric(line), block = as.numeric(block))]
out <- cbind(out, dt[, list(individual, age)])

これはdata.txtファイルで機能します。

于 2013-06-11T13:35:59.597 に答える