2016-10-06 6 views
0

におけるカラムヘッドの対応する値によって行のすべての値は、私はこれを持っていますcsvファイルなどのデータ:私はこれを探しています分割Iカラムヘッドに対応する値によって行の値を分割し、各列</p> <p>の和を取得する必要R

df <- 
    read.table(text = 
"Year 2 3 4 5 6 7 8 
1985 0 4 0 4 0 0 0 
1986 1 3 3 0 9 7 6 
1987 5 0 0 0 0 0 8 
1988 7 2 0 8 0 3 0 
1989 0 0 0 1 0 2 0" 
      , check.names = FALSE) 

Year 2 3 4 5 6 7 8  SUM 
1985 0 1.3 0 0.8 0 0 0  2.13 
1986 0.5 1 0.75 0 1.5 1 0.75 5.5 
1987 2.5 0 0 0 0 0 1  3.5 
1988 3.5 0.6 0 1.6 0 0.4 0  6.19 
1989 0 0 0 0.2 0 0.2 0  0.49 

その後、私はcsvファイルとして結果を保存する必要が

を結果。

+1

'df/as.numeric(名前(df))[col(df)]'が動作します。次に、 'rowsSums'とroundで他の列を追加するだけです。 –

+0

@RichScrivenこのように動作するかどうかはわかりません。 – 989

答えて

0

dplyrを使用してコードをクリーンアップする方法は、applyを使用して列名を数値に変換する方法です。 row.namesを列( "YEAR")に変更したので、それらを個別に処理する必要があることに注意してください。ここでは、私はdf[ ,-1]でその列を削除して、それを最後に追加します(ここではmutateを使用しますが、別々に行うこともできます)。

あるいは
apply(df[,-1], 1, function(x){ 
    x/as.numeric(colnames(df)[-1]) 
}) %>% 
    t %>% 
    addmargins(2) %>% 
    data.frame(check.names = FALSE) %>% 
    mutate(YEAR = df$YEAR) %>% 
    select(YEAR, everything()) 

、おそらく過剰この例では(おそらく有用より広く)制御及び要約の両方のためのいくつかの潜在的に、より柔軟な選択肢を与える、長い最初に変換するtidyrを使用することである。

df %>% 
    gather(head, val, -YEAR) %>% 
    mutate(divided = val/as.numeric(head)) %>% 
    select(-val) %>% 
    spread(head, divided) %>% 
    mutate(Sum = rowSums(.[ , -1])) 

どちらもほぼ同じ形式で同じ値を示します。

0

次のようにして、これを効率的に実現することができます。

m <- as.matrix(df[,-1]) 
m <- round(t(t(m)/m[1,]),2) 
df[-1,-1] <- m[-1,] 
df$SUM <- rowSums(df[,-1]) 

# V1 V2 V3 V4 V5 V6 V7 V8 SUM 
#1 Year 2.0 3.00 4.00 5.0 6.0 7.00 8.00 35.00 
#2 1985 0.0 1.33 0.00 0.8 0.0 0.00 0.00 2.13 
#3 1986 0.5 1.00 0.75 0.0 1.5 1.00 0.75 5.50 
#4 1987 2.5 0.00 0.00 0.0 0.0 0.00 1.00 3.50 
#5 1988 3.5 0.67 0.00 1.6 0.0 0.43 0.00 6.20 
#6 1989 0.0 0.00 0.00 0.2 0.0 0.29 0.00 0.49 

たちが行列で行うことができるベクトル化事業からの利益を得るためにmを行列にdfを変換します。ここで行われるものである:

  1. バックdf
  2. からmにデータを入れて最初の行の要素単位
  3. によって各行
  4. m(最初の列を除外する)
  5. 分割をマトリックスにdf換算df

に行ごとの合計を計算しますので、csvファイルとして保存するよう:

write.csv(file=fileName, x=df) 
関連する問題