2015-04-06 33 views
3

對於以下數據,我希望將每列替換爲(除以) - >/對應的長度。(即A/LEN,B/LEN,C/LEN,...)在R中的另一列對多個(70)列進行操作

...意味着更多的列,高達70 作爲這種具有許多列,如何應該繼續?

A B C  D E  F ... len 

2 4 5  7 8  8   5 
5 8 3  1 0  4   6 
8 9 3  9 6  2   12 
2 6 2  6 7  8   10 
1 2 4  2 9  5   20 
+4

'DF [-ncol(DF)]/DF $ len'? –

+0

@RichardScriven讓它成爲一個答案。 – Thomas

+0

[如何將相同的函數應用於data.table中的每個指定列]可能的重複(http://stackoverflow.com/questions/16846380/how-to-apply-same-function-to-every-specified-column -in-a-data-table)看起來和我差不多......我更喜歡'set'的答案,所以...... – Frank

回答

6

如果您的數據幀df正是爲你展示,你可以簡單地做

df[-ncol(df)]/df$len 

如果您有其他的列排除,並且希望他們都包括在結果中,你可以做像

with(df, cbind(ID, df[!names(df) %in% c("ID", "len")]/len, len)) 
# ID   A  B C   D E   F len 
# 1 1 0.4000000 0.800000 1.00 1.4000000 1.60 1.6000000 5 
# 2 2 0.8333333 1.333333 0.50 0.1666667 0.00 0.6666667 6 
# 3 3 0.6666667 0.750000 0.25 0.7500000 0.50 0.1666667 12 
# 4 4 0.2000000 0.600000 0.20 0.6000000 0.70 0.8000000 10 
# 5 5 0.0500000 0.100000 0.20 0.1000000 0.45 0.2500000 20 

此外,由大衛的意見建議,您可以使用data.table

library(data.table) 
x <- c(1L, ncol(df)) 
setDT(df)[, names(df)[-x] := lapply(.SD, "/", df$len), .SDcols = -x] 

這導致

# ID   A  B C   D E   F len 
# 1: 1 0.4000000 0.800000 1.00 1.4000000 1.60 1.6000000 5 
# 2: 2 0.8333333 1.333333 0.50 0.1666667 0.00 0.6666667 6 
# 3: 3 0.6666667 0.750000 0.25 0.7500000 0.50 0.1666667 12 
# 4: 4 0.2000000 0.600000 0.20 0.6000000 0.70 0.8000000 10 
# 5: 5 0.0500000 0.100000 0.20 0.1000000 0.45 0.2500000 20 

其中df

df <- read.table(text = "ID A B C  D E  F len 
1 2 4 5  7 8  8 5 
2 5 8 3  1 0  4 6 
3 8 9 3  9 6  2 12 
4 2 6 2  6 7  8 10 
5 1 2 4  2 9  5 20", header = TRUE) 
+3

你也可以用'data.table'通過引用來更新(雖然它的a (df)[,名稱(df)[ - ncol(df)]:= lapply(.SD,function(x)x/df $ len)標記爲[tag:data.table]'setDT ,.SDcols = - 「len」]' –

+0

如果我在「A」之前有一列「Id」,並且不想對它進行除法運算,那麼呢? –

+0

哦..這太簡單了,真好! –

相關問題