呼叫&基于字符串创建新列

时间:2017-01-18 22:29:26

标签: r variables dataframe

我已经搜索了很多但没有找到解决这个问题的问题 - 但是如果已经回答了这个问题,请原谅我,在编码时我仍然很绿。我有一个包含大量变量的数据框,我想将它们结合起来。根据我在循环中放入第二个数据框的名称创建新变量。数据框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])

如何以这种方式将这些字符串识别为变量?感谢。

3 个答案:

答案 0 :(得分:1)

有更简单的方法可以做到这一点,但我会坚持你的大部分代码作为解释的手段。只要您将for循环编辑为以下内容,您的代码就可以运行:

for (i in 1:length(formulas[,"a"])){
    data[formulas[i,"a"]] = data[formulas[i,"b"]] - data[formulas[i,"c"]]
}
  1. formulas[,a]因为你已经定义为a的变量在索引中不合适而无法工作。如果您希望列" a"中的所有行,请改用formulas[, "a"]。在data.frame formulas
  2. 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