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.frameformulas
中列“a”中的所有行,请使用公式[,“a”]
data$formulas
在data.framedata
中逐字搜索名为“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
是的,这个解决方案对我拥有的实际数据有效,对我来说似乎比循环更优雅。谢谢你的指导。