从R中的许多列中减去数据框中的列

TPM*_*TPM 5 r dataframe

我有一个数据框。我想从所有其他列中减去第二列。我可以循环执行此操作,但我想在一个电话中进行。这是我的工作循环代码:

df <- data.frame(x = 100:101, y = 2:3,z=3:4,a = -1:0,b=4:5)

for( i in 3:length(df) ) {
    df[i] <- df[i] - df[2]
}
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

如果您需要3:ncol(df)从第二列减去列

df[3:ncol(df)] <- df[3:ncol(df)]-df[,2]
Run Code Online (Sandbox Code Playgroud)


Tun*_*ung 5

使用dplyr::mutate_at()函数的另一种解决方案

# install.packages("dplyr", dependencies = TRUE)
library(dplyr)

df <- data.frame(x = 100:101, y = 2:3, z = 3:4, a = -1:0, b = 4:5)
df %>%
  mutate_at(vars(-matches("y"), -matches("x")), list(dif = ~ . - y))
#>     x y z  a b z_dif a_dif b_dif
#> 1 100 2 3 -1 4     1    -3     2
#> 2 101 3 4  0 5     1    -3     2
Run Code Online (Sandbox Code Playgroud)

更新:从 开始dplyr 1.0+,建议使用across

df %>%
  mutate(across(c(-matches("y"), -matches("x")), ~ . - y, .names = "{col}_dif"))
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)于 2019-11-05 创建