R 根据名称向量对数据框列采取行动

问题描述 投票:0回答:2

假设我有一个简单的数据框和向量,如下所示。我想将

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]
  }
}
r
2个回答
0
投票

我希望这对你有用

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

0
投票

虽然可能不是最快的解决方案,但

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
© www.soinside.com 2019 - 2024. All rights reserved.