3

ここのR初心者:1日以上の簡単な答えでなければならないものを検索した後、ここに私の最初の質問を投稿することにしました:

データフレーム内の数値列を数値ベクトルで乗算(または除算)したいと思います。データフレームには、数字だけでなく文字列も含まれています。私の検索では、、、、および置換操作について学びましt(t(mydf) * myvec))sweep()scale()*apply()データフレームをサブセット化せずにどの列を乗算するかを指定できる巧妙な関数を見つけるのに苦労しています。

test.datの最後の2列の各行をmyvecで乗算/除算し、変更されていない列とともに結果を含むデータフレームを取得するにはどうすればよいですか>(数値の場合はmyvecに「1」を追加できます)。しかし、どのように名前を扱うのですか?前もって感謝します!!

適切な例:

mydf <-as.data.frame(rbind(c( "chrX"、5624624、5631869、 "Nudt11"、2、 "+"、1、7245、1.332、9651.3)、c( "chrX"、5977262、6210835、 "Shroom4"、9、 "+"、1、233573、1.357、316914)))

colnames(mydf)<-c( "chr"、 "start"、 "end"、 "name"、 "score"、 "strand"、 "score2"、 "width"、 "value"、 "value2")

myvec <-c(10、0.0001)

4

2 に答える 2

4

すでに述べたように、あなたはあなたの例で扱っていませんdata.framedata.frame最初にデータを作成しましょう。

# bind the numerical values as variables (columns) of data.frame
mydf <-as.data.frame(cbind(
 c(1, 10, 3.6, 4.5, 5.4, 99), 
 c(12, 18, 9, 8.1, 7.2, 84)))

# give names to columns: 
names(mydf)<-c("somename","othername")

#multiply the wanted rows with myvec:

mydf[4:6,]<-myvec*mydf[4:6,]
mydf
  somename othername
1  1.00000  12.00000
2 10.00000  18.00000
3  3.60000   9.00000
4 40.50000  72.90000
5 54.00000  72.00000
6 16.50033  14.00028

編集:繰り返しますが、サンプルデータはdata.frameではありませんが、数値が実際には数値であり因子ではない適切なデータフレームに調整した後でも、これは機能します。

mydf[,9:10]<-myvec*mydf[,9:10]
mydf
   chr   start     end    name score strand score2  width     value     value2
1 chrX 5624624 5631869  Nudt11     2      +      1   7245 1.332e+01 96513.0000
2 chrX 5977262 6210835 Shroom4     9      +      1 233573 1.357e-04    31.6914

したがって、角かっこを使用して任意の列を選択できますmyvec。リサイクルによって驚くべき結果が得られないように、の長さが列の数と等しいことを確認してください。

于 2013-03-21T07:33:00.470 に答える
1

最初のステップは、文字マトリックスmydf(データフレームではない)を名前付き列を持つデータフレームに変更することです。

mydf2 <- setNames(as.data.frame("mode<-"(t(mydf[ , -1]), "numeric")), mydf[ , 1])

> mydf2
  somename othername
1      1.0      12.0
2     10.0      18.0
3      3.6       9.0
4      4.5       8.1
5      5.4       7.2
6     99.0      84.0

そうすれば、myvec:を使った乗算を簡単に適用できます。

res <- lapply(mydf2[4:6, ], "*", myvec)

値を新しい値に置き換えます。

mydf2[4:6, ] <- res

> mydf2
  somename othername
1  1.00000  12.00000
2 10.00000  18.00000
3  3.60000   9.00000
4 40.50000  72.90000
5 54.00000  72.00000
6 16.50033  14.00028

アップデート

あなたの編集に基づいて、これを行う方法は次のとおりです。

last2 <- tail(seq_along(mydf), 2) # find the index of the last two columns

# transform columns from factor to numeric and multiplicate with vector
res <- lapply(lapply(mydf[last2], 
                     function(x) as.numeric(as.character(x))), "*", myvec)

mydf[last2] <- res # replace values

> mydf
   chr   start     end    name score strand score2  width     value     value2
1 chrX 5624624 5631869  Nudt11     2      +      1   7245 1.332e+01 96513.0000
2 chrX 5977262 6210835 Shroom4     9      +      1 233573 1.357e-04    31.6914
于 2013-03-21T07:26:57.580 に答える