2017-01-10 11 views
1

これはこれは私がこれは私がしようとしたものです計算の割合が

No col1 col2 col3 Total p_col1 p_col2 p_col3 
    1 5 8 9  70 (5/70) (8/70) (9/70) 
    2 3 4 11 80 (3/80) (4/80) (11/80) 
    . . . .  .  .  .  . 
    . . . .  .  .  .  . 
    10 6 1 15 90  .  .  . 

を達成しようとしているものです

No col1 col2 col3 Total 
1 5 8 9  70 
2 3 4 11 80 
. . . .  . 
. . . .  . 
10 6 1 15 90 

私のデータである

DF1=read.csv("R/path/abc_5.csv") 
DF1 <- DF1[,c(1:6,12)] 
nop <- basename("R/path/abc_5.csv") 
    m <- gregexpr("[0-9]", nop) 
    nop <- as.numeric(unlist(regmatches(nop, m))) 
    nop <- nop[length(nop)] 
    DF2 <- DF1[,2:(nop+1)] 
    cn <- colnames(DF1)[2:(nop+1)] 
    cn_p <- paste("p_",cn) 
    DF1$cn_p[1] <- mapply("/", DF1$cn[1], DF1$Total)*100 

私はループ内のすべての列に対してこれを自動化したいので、最初に1列だけをテストしました しかし、私は取得していません適切な出力 どんな助けも高く評価されるでしょう。

+0

を使用することができます]]) '; 'cbind()' –

答えて

3

私たちは、あなただけのI/dtは[[ "総" `sapply(DT [C(-1、-ncol(DT))]、機能(I)に必要

DF1[paste0("p_", names(DF1)[2:4])] <- DF1[2:4]/DF1$Total 
+0

私の解決策よりもずっと優れています! –

+0

@ChirayuChamoliコメントありがとうございます。 – akrun

+1

@akrunあなたはそれをとてもシンプルにしましたが、私は不必要にループを使って複雑にしようとしていたと思います。ありがとう、トン! – Deepesh

2

これはうまくいくはずです。 sapplyを使用して、合計で割られた行を供給します。 namesを使用して、新しく作成する列に名前を割り当てることができます。

xx=cbind(df,sapply(df[2:(ncol(df)-1)], function(x) x/df$Total)) 
names(xx)[(ncol(df)+1):(length(xx))]=paste('p_',names(xx)[(ncol(df)+1):(length(xx))], sep = '') 
+0

なぜ 'apply()'の内部に? –

+0

ええ、私はそれを理解しました...変更を加えてください –