2013-06-05 11 views
5

これはddplyを使って簡単ですが、まだRの初心者で、頭の中で頭がおかしくないと思います。私は割合に一度に一つの変数を変換することができddplyを使用してデータフレーム内の各セルのパーセンテージを計算する方法は?

私はこれをやって、この

txt <- "label var1 var2 var3 var4 var5 var6 var7 
lab1 401 80 57 125 118 182 83 
lab2 72 192 80 224 182 187 178 
lab3 7 152 134 104 105 80 130 
lab4 3 58 210 30 78 33 87 
lab5 1 2 3 1 1 2 6" 

mydata <- read.table(textConnection(txt), sep = " ", header = TRUE) 

ように見えるdata.frameを持つ

mydata$var1 <- round(prop.table(mydata$var1),3)*100 

しかし、どのようにすべての変数(VAR1でそれを行うには: var7)を1回のストロークでdata.frameに挿入しますか?

注:変数には長さと変数の数が時々刻々と異なるため、コードにはこれに敏感でなければなりません。

ありがとうございました

答えて

4

ファンシーパッケージの必要はありません。これは、最初の列以外のすべてのユーザーにそれを実行したい限り、機能します。 2:ncolが適切でない場合は、列が含まれる条件を調整できます。あなたはおよそplyrdplyrを尋ねたので、

t(round(t(mydata[, 2:ncol(mydata)])/colSums(mydata[, 2:ncol(mydata)]) * 100, 3)) 

とは、ddplyの改良版で、ここにあなたがそれでそれを行うだろう方法は次のとおりです。

require(dplyr) 
require(reshape2) 

mydata %>% melt(id.vars = "label") %>% 
    group_by(variable) %>% 
    mutate(prop = round(value/sum(value) * 100, 3)) %>% 
    dplyr::select(-value) %>% 
    dcast(label ~ variable, fun.aggregate = sum, value.var = "prop") 

割合を計算し、長い形式にデータを変換します、それをワイドに戻します。 Simon O'Hanlonがすばらしい1ライナーであることを示すための多くのタイプ入力ですが、dplyrメソッドは、どんな種類の計算にもうまくいきます。

+0

ありがとうございます。それは完璧に動作します – Einnor

+0

@Ennorあなたの質問に答えた場合は、この質問を表示することを受け入れることを検討するべきです(読んでいない - 義務付けられていません)。私はあなたの6つの質問に対する答えをまだ受け入れていないことに気付きます。あなたがサイトを最大限に活用するためにSOがどのように機能するかを見るには、[** about **](http://stackoverflow.com/about)を読んでみてください。 –

+0

@ Simon0101私は答えを受け入れるべきであることを知らなかった。しかし、するでしょう:) – Einnor

2

たぶん、このようなものはあなたを助けることができる:

cbind(label=mydat[,1],as.data.frame(apply(mydat[,-1], 2, function(col) round(prop.table(col),3)*100))) 
+0

これはうまくいく、ありがとう:) – Einnor

+0

これは、 'data.frame(mydata [1]、lapply(mydata [-1]、function(x)round(prop.table(x)* 100、 3))) ' – thelatemail

5

はちょうどそうmatrixに強要などprop.tableにマージン引数を使用します。たとえば

round(prop.table(as.matrix(df),2) * 100 , 3) 

set.seed(123) 
df <- data.frame(matrix(sample(4 , 12 , repl=TRUE) , 3)) 
df 
# X1 X2 X3 X4 
#1 2 4 3 2 
#2 4 4 4 4 
#3 2 1 3 2 
round(prop.table(as.matrix(df),2) * 100 , 3) 
# X1  X2 X3 X4 
#[1,] 25 44.444 30 25 
#[2,] 50 44.444 40 50 
#[3,] 25 11.111 30 25 

あなたの例では、私はrownamesが実際には文字値の列。この最初の列以外のすべての列にprop.tableを使用するには、prop.table(df[,-1] , margin = 2)を実行します。

+0

ありがとう、これも同様に動作します – Einnor