我已经搜索了很多但没有找到解决这个问题的问题 - 但是如果已经回答了这个问题,请原谅我,在编码时我仍然很绿。我有一个包含大量变量的数据框,我想将它们结合起来。根据我在循环中放入第二个数据框的名称创建新变量。数据框formulas
应该创建&从主数据框data
USDb = c(1,2,3)
USDc = c(4,5,6)
EURb = c(7,8,9)
EURc = c(10,11,12)
data = data.frame(USDb, USDc, EURb, EURc)
现在我想创建一个由
定义的新列data$USDa
data$USDa = data$USDb - data$USDc
等欧元和其他变量。这很容易手动完成,但我想创建一个从[{1}}中提取名称的循环,如下所示:
formulas
显然a = c("USDa", "EURa")
b = c("USDb", "EURb")
c = c("USDc", "EURc")
formulas = data.frame(a,b,c)
for (i in 1:length(formulas[,a])){
data$formulas[i,a] = data$formulas[i,b] - data$formulas[i,c]
}
这会返回data$formulas[i,a]
,所以我尝试NULL
并返回data$paste0(formulas[i,a])
如何以这种方式将这些字符串识别为变量?感谢。
答案 0 :(得分:1)
有更简单的方法可以做到这一点,但我会坚持你的大部分代码作为解释的手段。只要您将for循环编辑为以下内容,您的代码就可以运行:
for (i in 1:length(formulas[,"a"])){
data[formulas[i,"a"]] = data[formulas[i,"b"]] - data[formulas[i,"c"]]
}
formulas[,a]
因为你已经定义为a
的变量在索引中不合适而无法工作。如果您希望列" a"中的所有行,请改用formulas[, "a"]
。在data.frame formulas
。data$formulas
实际上正在搜索名为" formula"的列。在data.frame data
中。相反,你想写data[formulas]
(当然,知道你需要索引formulas
才能使它成为一个合适的字符串)答案 1 :(得分:0)
逻辑:使用内部apply
循环的for
迭代每个公式,并根据公式进行计算
x = apply(formulas, 1, function(x) data[[x[3]]] - data[[x[2]]])
colnames(x) = formulas$a
x
# USDa EURa
#[1,] 3 3
#[2,] 3 3
#[3,] 3 3
cbind(data, x)
# USDb USDc EURb EURc USDa EURa
#1 1 4 7 10 3 3
#2 2 5 8 11 3 3
#3 3 6 9 12 3 3
答案 2 :(得分:0)
另一个选项是split
sapply
sapply(setNames(split.default(as.matrix(formulas[-1]),
row(formulas[-1])), formulas$a), function(x) Reduce(`-`, data[rev(x)]))
# USDa EURa
#[1,] 3 3
#[2,] 3 3
#[3,] 3 3