我有一个数据框(df),我希望能够添加A来测试并保持它被称为A,然后B来测试并保持那个叫B然后C来测试并再次保持那个叫做C而不用硬编码列名称(我将确切地知道要添加到测试的列数和测试名称,因此这两个方面都可以作为代码的一部分):
| A | B | C | test
------ | ------ | ------ | ------ | ------
area_1 | 0.870 | 0.435 | 0.968 | 0.679
area_2 | 0.456 | 0.259 | 0.906 | 0.467
area_3 | 0.298 | 0.256 | 0.457 | 0.768
area_4 | 0.994 | 0.987 | 0.365 | 0.765
目前我的代码看起来像这样(n设置为我想要添加到测试中的列数),但它给我留下了大量的NA:
for (j in 1:n) {
df[,j] <- eval(df[,j] + df$test)
}
答案 0 :(得分:2)
您可以使用lapply()
:
df[1:3] <- lapply(df[-4], function(x) x + df$test)
> df
# A B C test
#area_1 1.549 1.114 1.647 0.679
#area_2 0.923 0.726 1.373 0.467
#area_3 1.066 1.024 1.225 0.768
#area_4 1.759 1.752 1.130 0.765
答案 1 :(得分:2)
为什么不简单地做:
df[, -ncol(df)] <- df[, -ncol(df)] + df[[ncol(df)]]
示例强>
df <- data.frame(a = rep(1,5), b = rep(2, 5), c = rep(3,5))
# a b c
#1 1 2 3
#2 1 2 3
#3 1 2 3
#4 1 2 3
#5 1 2 3
df[, -ncol(df)] <- df[, -ncol(df)] + df[[ncol(df)]]
# a b c
#1 4 5 3
#2 4 5 3
#3 4 5 3
#4 4 5 3
#5 4 5 3