R 电话及;基于字符串创建新列

R 电话及;基于字符串创建新列,r,variables,dataframe,R,Variables,Dataframe,我已经搜索了很多次,没有找到一个可以解决这个问题的问题——但是如果这个问题已经得到了回答,请原谅,我对一般的编码还是比较生疏的。我有一个包含大量变量的数据框,我想根据我在循环的第二个数据框中输入的名称组合并创建新的变量。数据框公式应该从主数据框数据 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$

我已经搜索了很多次,没有找到一个可以解决这个问题的问题——但是如果这个问题已经得到了回答,请原谅,我对一般的编码还是比较生疏的。我有一个包含大量变量的数据框,我想根据我在循环的第二个数据框中输入的名称组合并创建新的变量。数据框
公式
应该从主数据框
数据

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
欧元和其他变量也是如此。这很容易手动完成,但我想创建一个循环,从
公式中提取名称,如下所示:

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])
并返回
错误:尝试应用非函数


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

逻辑:使用
apply
迭代每个公式,这是内部循环的
,并根据公式进行计算

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

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

for (i in 1:length(formulas[,"a"])){
    data[formulas[i,"a"]] = data[formulas[i,"b"]] - data[formulas[i,"c"]]
}
  • 公式[,a]
    将不起作用,因为您已经有一个定义为
    a
    的变量,该变量在索引中不合适。如果需要data.frame
    formulas
    中列“a”中的所有行,请使用
    公式[,“a”]
  • data$formulas
    在data.frame
    data
    中逐字搜索名为“formulas”的列。相反,您希望编写
    数据[公式]
    (当然,您需要为
    公式编制索引,以使其成为正确的字符串)

  • 另一个选项是使用
    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
    

    是的,这个解决方案对我拥有的实际数据有效,对我来说似乎比循环更优雅。谢谢你的指导。