如何使用 R 中另一个数据框中包含的值对数据框的列进行计算?

How to do calculations on a column of a data frame using values contained in another data frame in R?

我有 2 个数据框:一个包含实验数据,另一个包含一些常数值。实验数据和常数按类别(a 和 b)分开。我想在实验数据框中包含一个新列,它是以下计算的结果:

z = k*y

为此,我使用了 dplyr 包和 mutate() 函数,但没有得到预期的结果。有没有人有任何提示或建议,即使有必要使用另一个包?

library(dplyr)

Category <- c("a", "b")
k <- c(1, 2)

# Data frame with the constants for each category
Constant <- data.frame(Category, k)

x <- seq(0,5,1)

df <- expand.grid(x = x,
                  Category = Category)

# Data frame with the experimental resultas
df$y <- seq(1,12,1)

# Failed attempt to calculate z separated by categories
df %>%
  group_by(Category) %>%
  mutate(z = Constant*y)

我这样做了:

a = c()
for(i in unique(df$Category)){
  a = c(a,df[df$Category==i,"y"]*Constant[Constant$Category==i,'k'])
}
df$z=a

结果:

   x Category  y  z
1  0        a  1  1
2  1        a  2  2
3  2        a  3  3
4  3        a  4  4
5  4        a  5  5
6  5        a  6  6
7  0        b  7 14
8  1        b  8 16
9  2        b  9 18
10 3        b 10 20
11 4        b 11 22
12 5        b 12 24

我不知道这是否是您要找的。请记住,如果您的 df 按类别列

排序,则此方法有效

如果您不喜欢 for 循环,这里有一个 lapply 版本:

df$z =unlist( lapply(unique(df$Category), function(i){return(df[df$Category==i,"y"]*Constant[Constant$Category==i,'k'])}))

如果数据未按类别排序:

df$z=unlist(lapply(1:nrow(df),function(i){ return(df[i,"y"]*Constant[Constant$Category==df[i,"Category"],'k'])}))

使用 dplyr,您可以执行以下操作:

library(dplyr)

left_join(df, Constant, by = c("Category")) %>%
  mutate(z = k * y) %>%
  select(-k)