對於以下數據,我希望將每列替換爲(除以) - >/對應的長度。(即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
對於以下數據,我希望將每列替換爲(除以) - >/對應的長度。(即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
如果您的數據幀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)
你也可以用'data.table'通過引用來更新(雖然它的a (df)[,名稱(df)[ - ncol(df)]:= lapply(.SD,function(x)x/df $ len)標記爲[tag:data.table]'setDT ,.SDcols = - 「len」]' –
如果我在「A」之前有一列「Id」,並且不想對它進行除法運算,那麼呢? –
哦..這太簡單了,真好! –
'DF [-ncol(DF)]/DF $ len'? –
@RichardScriven讓它成爲一個答案。 – Thomas
[如何將相同的函數應用於data.table中的每個指定列]可能的重複(http://stackoverflow.com/questions/16846380/how-to-apply-same-function-to-every-specified-column -in-a-data-table)看起來和我差不多......我更喜歡'set'的答案,所以...... – Frank