如何使用 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)
我有 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)