将所有行与同一数据帧中的另一行相乘

时间:2019-01-07 01:44:49

标签: r dplyr data-manipulation

数据

我有一个类似于下面的虚拟数据集。

代码

library(dplyr)
set.seed(111)
data <- tibble(ID = sort(sample(LETTERS, 10, F)),
                A = round(rnorm(10, 4, 1), 1),
                B = sample(0:20, 10, F),
                C = rep(c(33, 9), each = 5))
data <- rbind(data, c("ratio", 0.7, 0.25, 0.05))

问题

我想产生一个新的数据框,其中每一行都乘以称为比​​率的行(不包括具有ID的第一列)。然后可以从输出表中删除比率行。

在dplyr中有一种简单的方法吗?

1 个答案:

答案 0 :(得分:2)

dplyr 更适合于列式操作,而不是像这样的按行操作。但这在基本R中非常简单:

library(dplyr)
set.seed(111)
data <- tibble(ID = sort(sample(LETTERS, 10, F)),
               A = round(rnorm(10, 4, 1), 1),
               B = sample(0:20, 10, F),
               C = rep(c(33, 9), each = 5))

ratio <- data.frame(A = 0.7, B = 0.25, C = 0.05) # your mutliplier
ratio <- ratio[rep(1, nrow(data)),] # replicated to match size of 'data'
data[2:4] <- data[2:4] * ratio # multiply

   ID        A     B     C
   <chr> <dbl> <dbl> <dbl>
 1 A      2.87  0.25  1.65
 2 B      1.75  2.5   1.65
 3 H      2.10  2     1.65
 4 I      2.17  4.5   1.65
 5 K      2.45  1.5   1.65
 6 L      2.66  2.75  0.45
 7 P      2.52  5     0.45
 8 S      4.06  4.75  0.45
 9 V      3.08  4.25  0.45
10 X      3.36  2.25  0.45

或者,您可以避免使用Map复制“比率”数据框以匹配主数据集的大小:

ratio <- data.frame(A = 0.7, B = 0.25, C = 0.05)  
data[2:4] <- Map('*', data[2:4], ratio)