乘以数据帧列

kar*_*los 3 r

我一直在摸不着头脑.我有两个数据框:df

df <- data.frame(group = 1:3,
                 age = seq(30, 50, length.out = 3),
                 income = seq(100, 500, length.out = 3),
                 assets = seq(500, 800, length.out = 3))
Run Code Online (Sandbox Code Playgroud)

weights

weights <- data.frame(age = 5, income = 10)
Run Code Online (Sandbox Code Playgroud)

我想将这两个数据帧仅用于相同的列名称.我试过这样的事情:

colwise(function(x) {x * weights[names(x)]})(df)
Run Code Online (Sandbox Code Playgroud)

但这显然不起作用,因为colwise没有将列名保留在函数内.我查看了各种mapply解决方案(示例),但我无法得出答案.

结果data.frame应如下所示:

structure(list(group = 1:3, age = c(150, 200, 250), income = c(1000, 
3000, 5000), assets = c(500, 650, 800)), .Names = c("group", 
"age", "income", "assets"), row.names = c(NA, -3L), class = "data.frame")

  group age income assets
1     1 150   1000    500
2     2 200   3000    650
3     3 250   5000    800
Run Code Online (Sandbox Code Playgroud)

Rei*_*son 6

sweep()对于这个特殊的例子,这里是你的朋友.它依靠的名称df,并weights以正确的顺序是,但可以安排.

> nams <- names(weights)
> df[, nams] <- sweep(df[, nams], 2, unlist(weights), "*")
> df
  group age income assets
1     1 150   1000    500
2     2 200   3000    650
3     3 250   5000    800
Run Code Online (Sandbox Code Playgroud)

如果变量名称在weightsdf中的顺序不同,则可以这样做:

> df2 <- data.frame(group = 1:3,
+                   age = seq(30, 50, length.out = 3),
+                   income = seq(100, 500, length.out = 3),
+                   assets = seq(500, 800, length.out = 3))
> nams <- c("age", "income") ## order in df2
> weights2 <- weights[, rev(nams)]
> weights2  ## wrong order compared to df2
  income age
1     10   5
> df2[, nams] <- sweep(df2[, nams], 2, unlist(weights2[, nams]), "*")
> df2
  group age income assets
1     1 150   1000    500
2     2 200   3000    650
3     3 250   5000    800
Run Code Online (Sandbox Code Playgroud)

换句话说,我们重新排序,使所有对象ageincome在正确的顺序.