2017-08-01 3 views
0

3列ごとにまとめて結果を新しい列に入れているので、300列以上のデータフレームでこれを行う必要があります。私は追加を実行するループを作ることができますが、私は新しい列の名前を付けることに問題があります。私は彼らが私のコードでは、しかし「NEW1」、「NEW2」と「new3」として表示される新しい列の名前を希望ループ内の新しい列の名前を作成

x1 <- rnorm(100) 
x2 <- rnorm(100) 
x3 <- rnorm(100) 
x4 <- rnorm(100) 
x5 <- rnorm(100) 
x6 <- rnorm(100) 
x7 <- rnorm(100) 
x8 <- rnorm(100) 
x9 <- rnorm(100) 
x10 <- rnorm(100) 
x11 <- rnorm(100) 
x12 <- rnorm(100) 
df <- data.frame(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10, x11,x12) 

for (i in 2:4){ 
    new <- apply(df[,c(i,i+3,i+6)],1,sum,na.rm=T) 
    df <- cbind(df, new[i-1]) 
} 

:ここで私は、私はそうVARを試してみました何をしたいの例ですすべての名前が "new [i]"であることを確認してください。ループを使用せずにこの列を作成する方法は他にもありますが、おそらくより良い方法があると確信していますが、 it.Thanks

+1

FYI、これを行うにはより多くのR-っぽい、ベクトル化の方法は、 'CBIND(DF、setNames(data.frame(rowSums(DF [C(T、F、だろうpaste0( 'new'、seq(ncol(df)/ 4)、rowSums(df [c(F、T、F)])、rowSums(df [ )))) – Sotos

答えて

3

次のにcbindを交換し、その後、あなたは新しい列名を割り当てることができるようになります。

for (i in 2:4){ 
    new <- apply(df[,c(i,i+3,i+6)],1,sum,na.rm=T) 
    df[paste0("new", i-1)] <- new 
} 
+1

大変感謝しています!また、名前(df)[names(df)== "new"] < - paste( "new"、i-1)を追加すると解決する –

1

結果をデータフレームのリストにするか、「新しい[n]」列のそれぞれに1データフレームを追加しますか?私の仮定は二だった...

try_me <- cbind(df, as.data.frame(lapply(2:4, function(i){ 
    new <- apply(df[,c(i,i + 3,i + 6)], 1, sum, na.rm = T) 
    new_new <- setNames(as.data.frame(new), sprintf('new%s', i)) 
    new_new 
}))) 




> head(try_me[,10:length(try_me)], 3) 
     x10  x11  x12  new2  new3  new4 
1 -0.5166034 -2.3482017 1.1860505 -3.1887135 -2.556875 1.971905 
2 1.6145366 -0.6343859 -0.1606501 0.5623611 1.606436 1.657789 
3 0.3042580 -0.2176613 1.6796682 1.3500827 -1.022463 -1.182379 
関連する問題