从 R 中的变量和系数创建公式计算
Creating a formula calculation from variables and coefficients in R
我有两个数据框。一个包含主要数据和带有值的变量。第二个带有系数,它们所属的变量以及它们适用的条件。我在 Whosebug 上做了一些搜索,大部分答案都涉及将这种方法与线性模型相结合。我的问题比那个更简单(我认为),我希望得到任何反馈。
下面是我的两个数据框的一些示例数据。
理想情况下,我想要 "data" 中的一个新列,它是基于 "data" 中的变量乘以它们在 "coeff" 中关于位置的系数的计算。因此,在下面的示例中,美国只有睡眠值和账面值,而 AU 具有全部 3 个值。我想要一种方法来为 "data" 中的每一行创建一个公式,该公式贯穿所有变量和系数的计算。
我想通过每年更换系数文件和数据文件来进行更新,因此能够灵活地满足该标准是一大优势。根据位置的变量在有多少坚持什么位置方面会有很大不同。
data <- data.frame(Location = c("US", "UK", "AU","US"), Sleep = c(7, 4, 10, 11), Desk = c(0, 0, 1, 0),
Book = c(11,0,19,3))
coeff<-data.frame(Location = c("US","US","UK","UK","AU","AU","AU"),
Variable = c("Sleep", "Book","Sleep", "Book","Sleep", "Book","Desk"),
Coefficient = c(.03,.11,.24,.004,.012,.10,.71))
对于第 1 行中的美国,它将是 (7*.030) + (11*.110)=1.42
可能是这个脚本有帮助(它使用数据,table 包):
library(data.table)
data <- data.table(Location = c("US", "UK", "AU","US"), Sleep = c(7, 4, 10, 11), Desk = c(0, 0, 1, 0),
Book = c(11,0,19,3))
coeff<-data.table(Location = c("US","US","Uk","Uk","AU","AU","AU"),
Variable = c("Sleep", "Book","Sleep", "Book","Sleep", "Book","Desk"),
Coefficient = c(.03,.11,.24,.004,.012,.10,.71))
data <- data[, order:=c(1:.N), by=Location]
d <- melt(data, id.vars=c('order','Location'), variable.name='Variable')
d <- merge(d,coeff, by=c('Location', 'Variable'), all=T)
d[is.na(d)] <- 0
d <- d[, result:=value*Coefficient,]
d <- d[,list(result=sum(result,na.rm=T)), by= list(order,Location)]
> head(d)
order Location result
1: 1 AU 2.73
2: 1 UK 0.00
3: 1 US 1.42
4: 2 US 0.66
5: 0 Uk 0.00
我有两个数据框。一个包含主要数据和带有值的变量。第二个带有系数,它们所属的变量以及它们适用的条件。我在 Whosebug 上做了一些搜索,大部分答案都涉及将这种方法与线性模型相结合。我的问题比那个更简单(我认为),我希望得到任何反馈。
下面是我的两个数据框的一些示例数据。
理想情况下,我想要 "data" 中的一个新列,它是基于 "data" 中的变量乘以它们在 "coeff" 中关于位置的系数的计算。因此,在下面的示例中,美国只有睡眠值和账面值,而 AU 具有全部 3 个值。我想要一种方法来为 "data" 中的每一行创建一个公式,该公式贯穿所有变量和系数的计算。
我想通过每年更换系数文件和数据文件来进行更新,因此能够灵活地满足该标准是一大优势。根据位置的变量在有多少坚持什么位置方面会有很大不同。
data <- data.frame(Location = c("US", "UK", "AU","US"), Sleep = c(7, 4, 10, 11), Desk = c(0, 0, 1, 0),
Book = c(11,0,19,3))
coeff<-data.frame(Location = c("US","US","UK","UK","AU","AU","AU"),
Variable = c("Sleep", "Book","Sleep", "Book","Sleep", "Book","Desk"),
Coefficient = c(.03,.11,.24,.004,.012,.10,.71))
对于第 1 行中的美国,它将是 (7*.030) + (11*.110)=1.42
可能是这个脚本有帮助(它使用数据,table 包):
library(data.table)
data <- data.table(Location = c("US", "UK", "AU","US"), Sleep = c(7, 4, 10, 11), Desk = c(0, 0, 1, 0),
Book = c(11,0,19,3))
coeff<-data.table(Location = c("US","US","Uk","Uk","AU","AU","AU"),
Variable = c("Sleep", "Book","Sleep", "Book","Sleep", "Book","Desk"),
Coefficient = c(.03,.11,.24,.004,.012,.10,.71))
data <- data[, order:=c(1:.N), by=Location]
d <- melt(data, id.vars=c('order','Location'), variable.name='Variable')
d <- merge(d,coeff, by=c('Location', 'Variable'), all=T)
d[is.na(d)] <- 0
d <- d[, result:=value*Coefficient,]
d <- d[,list(result=sum(result,na.rm=T)), by= list(order,Location)]
> head(d)
order Location result
1: 1 AU 2.73
2: 1 UK 0.00
3: 1 US 1.42
4: 2 US 0.66
5: 0 Uk 0.00