R中另一列对多个(70)列的操作

rac*_*ach 4 r dplyr data.table

对于以下数据,我希望每个列都被(除以) - > /相应的长度替换 .(即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
Run Code Online (Sandbox Code Playgroud)

Ric*_*ven 7

如果您的数据框df与您显示的完全一样,那么您可以这样做

df[-ncol(df)] / df$len
Run Code Online (Sandbox Code Playgroud)

如果您要排除其他列,并且您希望它们都包含在结果中,您可以执行类似的操作

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
Run Code Online (Sandbox Code Playgroud)

另外,正如David在评论中所建议的,您可以使用 data.table

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

结果

#    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
Run Code Online (Sandbox Code Playgroud)

这里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)
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用`data.table`通过引用更新(虽然它有点麻烦)因为它被标记为[tag:data.table]`setDT(df)[,names(df)[ - ncol(df)] := lapply(.SD,function(x)x/df $ len),. SDcols = - "len"]` (3认同)