假设我有一个简单的数据框和向量,如下所示。我想将
df
中的列除以 x
中对应的值。因此 a
中的 df
列将除以 2,列 b
将除以 4,而列 c
将保持不除。我可以编写一个循环来执行此操作,但是有更简单的方法吗?
# set up df and x
df <- data.frame(a=1:5, b=6:10, c=11:15)
x <- c(2,4,3)
names(x) <- c('a','b','d')
# Loop to do what I want
for (v in names(df)){
if (v %in% names(x)){
df[v] <- df[v]/x[v]
}
}
我希望这对你有用
list2DF(
Map(
\(x, y) x / y^(!is.na(y)),
df,
x[names(df)]
)
)
这给出了
a b c
1 0.5 1.50 11
2 1.0 1.75 12
3 1.5 2.00 13
4 2.0 2.25 14
5 2.5 2.50 15
虽然可能不是最快的解决方案,但
sweep
就是为此而设计的。只要找到一种正确索引的方法即可。已经晚了,也许可以进行更简洁的匹配。 (也许需要额外订购。我明天会回来适应)。
idx = !is.na(match(colnames(df), names(x)))
df[idx] = sweep(df[idx], 2, x[idx], "/")
df
a b c
1 0.5 1.50 11
2 1.0 1.75 12
3 1.5 2.00 13
4 2.0 2.25 14
5 2.5 2.50 15