使用单个向量突变数据框中一个值的多列

时间:2019-11-07 19:36:08

标签: r dplyr

我正在尝试执行以下操作:填充表格,将左侧的向量(df2)与原始2(df1:y1至y10)中的每个值相乘。我实际上有一个更大的数据集,但这是可重复的。

enter image description here

数据帧

df1:
y1    y2    y3    y4
5     10    15    20

df2:
perc
0.08
0.02
0.08
0.12
0.20
0.30
0.12
0.03
0.01

我尝试过的代码:

try1 <- df2 %>% mutate_each_(.funs = funs(. * df1[1,]), .cols = vars(contains("y")))

try2 <- df2 %>% mutate_each_(funs = funs(. * df1[1,]), vars = vars(contains("y")))

try3 <- df2 %>% mutate_at(.funs = funs(X = .*df1[1,1:5]), .vars = c(y1:y5))

try4 <- df1 %>% mutate_each(funs(op = .*df2), y1:y5)

try5 <- cbind(df1,apply(df1[1,1:5],2, function(x) x*df2))

try6 <- cbind(df2,apply(df2[,1],2, function(x) x*df1[1,1:5]))

最后,我想重命名每列y1 = 2010 ... y5 = 2015,因为每列代表一年的值。

任何建议都非常欢迎。

已编辑

由于这将是一个矩阵运算,因此df1现在是具有更多元素N [3 x 10]的矩阵。 df2是相同的[1 x 9]。

我想以df O [27 x 10]结尾,如下图所示:

enter image description here

enter image description here

其中M的每个值(df2)乘以N的每个值(df1)。

2 个答案:

答案 0 :(得分:2)

简单的矩阵乘法可以轻松做到这一点。

.authorizeRequests()

如果要使用.antMatchers("/app/admin/**").hasRole("ADMIN") //or .antMatchers("/app/admin/**").hasAnyRole("ADMIN", "USER") //or .antMatchers("/app/admin/**").authenticated() //or .antMatchers("/app/admin/**").permitAll() ,可以执行此操作。

df <- as.data.frame(as.matrix(df2) %*% as.matrix(df1))

如果您真的想坚持“ tidyverse”,可以使用dplyr中的library(dplyr) df <- cbind(df2, df1) %>% mutate_at(vars(-perc), ~ perc * .) %>% select(-perc) 而不是crossing。这将适用于tidyr中的多行。

cbind

无论如何,您都可以使用df1重命名结果数据框。

library(tidyr)
library(tibble)

df2 %>%
  rowid_to_column("group") %>%
  crossing(df1) %>%
  mutate_at(vars(-group, -perc), ~ perc * .) %>%
  select(-perc)

稍后编辑(更多选项):

这会使用tidyverse中的names(),如果从两个数据帧(例如您的示例)开始,那么实际上可能是最干净的。

names(df) <- 2010:2013

您基本上可以在base中完成相同的操作,但这将返回矩阵而不是数据帧,除非我们对其进行转换。

purrr

答案 1 :(得分:2)

这是矩阵乘法

y = seq(5, 20, by = 5)
x = c(0.08, 0.02, 0.08, 0.12, 0.2, 0.3, 0.12, 0.03, 0.01)

y %*% t(x)
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
# [1,]  0.4  0.1  0.4  0.6    1  1.5  0.6 0.15 0.05
# [2,]  0.8  0.2  0.8  1.2    2  3.0  1.2 0.30 0.10
# [3,]  1.2  0.3  1.2  1.8    3  4.5  1.8 0.45 0.15
# [4,]  1.6  0.4  1.6  2.4    4  6.0  2.4 0.60 0.20

函数outer的功能更一般,您可以指定任何二进制操作(但默认值为*)。

outer(y, x)
# same result