R中另一列对多个(70)列的操作
Operation on multiple(70) columns by another column in R
下面的数据,我希望每一列都换成(除以)--> /对应的长度。(即A/len,B/len, C/len,...)
... 表示更多列,最多 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
此外,正如 David 在评论中所建议的,您可以使用 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)
下面的数据,我希望每一列都换成(除以)--> /对应的长度。(即A/len,B/len, C/len,...)
... 表示更多列,最多 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
此外,正如 David 在评论中所建议的,您可以使用 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)