我正在尝试执行以下操作:填充表格,将左侧的向量(df2)与原始2(df1:y1至y10)中的每个值相乘。我实际上有一个更大的数据集,但这是可重复的。
数据帧
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]结尾,如下图所示:
其中M的每个值(df2)乘以N的每个值(df1)。
答案 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