0

次のように、いくつかのブール値(1/0)を持つデータフレームがあります(これをスマートテーブルにする方法がわかりませんでした)

       Flag1.Sam Flag2.Sam Flag3.Sam Flag1.Ted Flag2.Ted Flag3.Ted
probe1         0         1         0         1         0         0
probe2         0         0         0         0         0         0
probe3         1         0         0         0         0         0
probe4         0         0         0         0         0         0
probe5         1         1         0         1         0         0

ファイルと呼ばれるリストにある64個のサンプル(サム/テッド....など)があります。

files <- c("Sam", "Ted", "Ann", ....) 

そして、各サンプルのフラグ値を合計して以下を作成する列を作成したいと思います。

               Sam Ted 
probe1.flagsum   1   1
probe2.flagsum   0   0 
probe3.flagsum   1   0 
probe4.flagsum   0   0
probe5.flagsum   2   1

私はRにかなり慣れていないので、知る必要があることに基づいて学習しようとしていますが、次のことを試しました:

for(i in files) {
    FLAGS$i <- cbind(sapply(i, function(y) { 
        #greping columns to filter for one sample
        filter1 <- grep(names(filters), pattern=y)
        #print out the summed values for those columns  
        FLAGS$y <-rowSums(filters[,(filter1)])
    }
}

上記のコードは機能せず、先に進む方法が少しわかりません。

この問題を解決したり、使用するコマンド/ツールの正しい方向を教えてくれる人はいますか?

ありがとうございました。

4

3 に答える 3

1

またはパッケージreshapeを使用する方がより直感的かもしれませんが、これはベース R で簡単に実行できます。reshapereshape2

ベースRのソリューションは次のとおりです。

# Here's your data in its current form
dat = read.table(header=TRUE, text="Flag1.Sam Flag2.Sam   Flag3.Sam   Flag1.Ted   Flag2.Ted   Flag3.Ted
probe1 0   1   0   1   0   0
probe2 0   0   0   0   0   0
probe3 1   0   0   0   0   0
probe4 0   0   0   0   0   0
probe5 1   1   0   1   0   0")
# Generate an ID row
dat$id = row.names(dat)
# Reshape wide to long
r.dat = reshape(dat, direction="long", 
                timevar="probe", 
                varying=1:6, sep=".")
# Calculate row sums
r.dat$sum = rowSums(r.dat[3:5])
# Reshape back to wide format, dropping what you're not interested in
reshape(r.dat, direction="wide", 
        idvar="id", timevar="probe", 
        drop=3:5)
##                id sum.Sam sum.Ted
## probe1.Sam probe1       1       1
## probe2.Sam probe2       0       0
## probe3.Sam probe3       1       0
## probe4.Sam probe4       0       0
## probe5.Sam probe5       2       1

猫の皮をむく方法は複数あります

次のような関数を作成することもできます。

myFun = function(data, varnames) {
  temp = vector("list", length(varnames))
  for (i in 1:length(varnames)) {
    temp[[i]] = colSums(t(dat[grep(varnames[i], names(data))]))
    names(temp)[[i]] = varnames[i]
  }
  data.frame(temp)
}

次に、名前のベクトルを使用します。

files = c("Sam", "Ted")
myFun(dat, files)
##        Sam Ted
## probe1   1   1
## probe2   0   0
## probe3   1   0
## probe4   0   0
## probe5   2   1

楽しみ!

于 2012-06-20T13:18:42.343 に答える
1

あなたの行列が入力と呼ばれると仮定します

input <- matrix(rbinom(30, 1, 0.5), ncol = 6)
colnames(input) <- c("F1.S", "F2.S", "F3.S", "F1.T", "F2.T", "F3.T")
rownames(input) <- paste("probe", 1:5, sep = "")
input <- as.data.frame(input)

library(reshape)
input$probe <- rownames(input)
Molten <- melt(input, id.vars = "probe")
Molten$ID <- gsub("^.*\\.", "", levels(Molten$variable))[Molten$variable]
cast(probe ~ ID, data = Molten, fun = "sum")

mrdwab のデータ フレームで更新する

dat = read.table(header=TRUE, text="Flag1.Sam Flag2.Sam   Flag3.Sam   Flag1.Ted   Flag2.Ted   Flag3.Ted
probe1 0   1   0   1   0   0
probe2 0   0   0   0   0   0
probe3 1   0   0   0   0   0
probe4 0   0   0   0   0   0
probe5 1   1   0   1   0   0")

library(reshape)
dat$probe <- rownames(dat)
Molten <- melt(dat, id.vars = "probe")
Molten$ID <- gsub("^.*\\.", "", levels(Molten$variable))[Molten$variable]
cast(probe ~ ID, data = Molten, fun = "sum")
于 2012-06-20T11:36:48.040 に答える
1

filtersが入力行列であり、目的の出力行列である場合FLAGS、私は (素朴に) 次のようにします。

FLAGS <- matrix(0,nrow=nrow(filters),ncol=length(files))
for(i in 1:length(files)){
    grep(files[i],colnames(filters)) -> index
    FLAGS[,i] <- rowSums(filters[,index])
    }
colnames(FLAGS) <- files
于 2012-06-20T11:36:18.683 に答える