在 R 中划分两个数据帧(一个到另一个)
Dividing Two Data Frames (One into the Other) in R
如何将一个数据框除以另一个?这两个数据框具有相同的列和相同的行,但我需要将每个相交与其对应的相交划分为一个新的数据框,例如以下:
DF1
Name Jan Feb Mar
Aaron 2 4 3
Blake 5 6 4
DF2
Name Jan Feb Mar
Aaron 4 6 6
Blake 7 6 5
DF1/DF2 = DF3
DF3 (result)
Name Jan Feb Mar
Aaron 0.5 0.7 0.5
Blake 0.7 1.0 0.8
我使用 subset 然后 dcast 来构建每个数据框,但很难弄清楚如何划分它们。感谢您的帮助!
我们将 'DF1' 和 'DF2' 中的数字列(通过删除第一列)和 cbind
与第一列分开。
DF3 <- cbind(DF1[1],round(DF1[-1]/DF2[-1],1))
DF3
# Name Jan Feb Mar
# 1 Aaron 0.5 0.7 0.5
# 2 Blake 0.7 1.0 0.8
既然你提到你使用 subset
和 dcast
来构建每个数据框,我怀疑你已经将这些数据全部放在一个数据框中,在这种情况下分配角色 numerator
和 denominator
可能是您需要做的所有事情,以便 运行 使用 ddply
进行计算。例如,使用您的示例数据并将其融合回长格式数据框,将为您提供以下单个 ddply
:
# data
DF1 <- data.frame(Name = c("Aaron", "Blake"), Jan = c(2, 5), Feb = c(4, 6), Mar = c(3, 4))
DF2 <- data.frame(Name = c("Aaron", "Blake"), Jan = c(4, 7), Feb = c(6, 6), Mar = c(6, 5))
# long format with 'numerator' and 'denominator' roles assigned
# (unnecessary if you already have long format, just assign numerator/denomninator)
library(reshape2)
df <- rbind(
transform(
melt(DF1, id.vars = "Name", variable.name = "Month"),
role = "numerator"),
transform(
melt(DF2, id.vars = "Name", variable.name = "Month"),
role = "denominator")
)
# ddply
library(plyr)
ddply(df, .(Name, Month), summarize,
Result = value[role == "numerator"] / value[role == "denominator"])
# Name Month Result
# 1 Aaron Jan 0.5000000
# 2 Aaron Feb 0.6666667
# 3 Aaron Mar 0.5000000
# 4 Blake Jan 0.7142857
# 5 Blake Feb 1.0000000
# 6 Blake Mar 0.8000000
如何将一个数据框除以另一个?这两个数据框具有相同的列和相同的行,但我需要将每个相交与其对应的相交划分为一个新的数据框,例如以下:
DF1
Name Jan Feb Mar
Aaron 2 4 3
Blake 5 6 4
DF2
Name Jan Feb Mar
Aaron 4 6 6
Blake 7 6 5
DF1/DF2 = DF3
DF3 (result)
Name Jan Feb Mar
Aaron 0.5 0.7 0.5
Blake 0.7 1.0 0.8
我使用 subset 然后 dcast 来构建每个数据框,但很难弄清楚如何划分它们。感谢您的帮助!
我们将 'DF1' 和 'DF2' 中的数字列(通过删除第一列)和 cbind
与第一列分开。
DF3 <- cbind(DF1[1],round(DF1[-1]/DF2[-1],1))
DF3
# Name Jan Feb Mar
# 1 Aaron 0.5 0.7 0.5
# 2 Blake 0.7 1.0 0.8
既然你提到你使用 subset
和 dcast
来构建每个数据框,我怀疑你已经将这些数据全部放在一个数据框中,在这种情况下分配角色 numerator
和 denominator
可能是您需要做的所有事情,以便 运行 使用 ddply
进行计算。例如,使用您的示例数据并将其融合回长格式数据框,将为您提供以下单个 ddply
:
# data
DF1 <- data.frame(Name = c("Aaron", "Blake"), Jan = c(2, 5), Feb = c(4, 6), Mar = c(3, 4))
DF2 <- data.frame(Name = c("Aaron", "Blake"), Jan = c(4, 7), Feb = c(6, 6), Mar = c(6, 5))
# long format with 'numerator' and 'denominator' roles assigned
# (unnecessary if you already have long format, just assign numerator/denomninator)
library(reshape2)
df <- rbind(
transform(
melt(DF1, id.vars = "Name", variable.name = "Month"),
role = "numerator"),
transform(
melt(DF2, id.vars = "Name", variable.name = "Month"),
role = "denominator")
)
# ddply
library(plyr)
ddply(df, .(Name, Month), summarize,
Result = value[role == "numerator"] / value[role == "denominator"])
# Name Month Result
# 1 Aaron Jan 0.5000000
# 2 Aaron Feb 0.6666667
# 3 Aaron Mar 0.5000000
# 4 Blake Jan 0.7142857
# 5 Blake Feb 1.0000000
# 6 Blake Mar 0.8000000