在R中使用do循环来创建新变量

use*_*861 2 r sas

我是一个很长时间的SAS程序员,希望跳转到R.我知道R对于变量重新编码并不是那么好,但有办法用do循环来做这个.

如果我有很多名为a_1 a_2 ... a_100,b_1 b_2 ... b_100的变量,我想创建新变量c_1 c_2 ... c_100,其中c_i = a_i + b_i.没有100条陈述,有没有办法做到这一点?

在SAS中,我只会使用:

%do i=1 %to 100;
c_&i = a_&i + b_&i;
%end;
Run Code Online (Sandbox Code Playgroud)

谢谢!

Spa*_*man 22

SAS使用基本的宏语言,它依赖于文本替换而不是像任何正确的编程语言那样评估表达式.您的SAS文件基本上是两件事:SAS命令和宏表达式(以'%'开头的东西).宏语言存在很大问题并且难以调试(例如,表达式中的表达式是否会扩展?为什么要进行"&& x"甚至"&&& x"?为什么这里需要两个分号?).与基于单一语法的精心设计的编程语言相比,它很笨重,而且不够优雅.

如果你的a_i变量是单个数字,那么你应该将它们作为向量 - 例如:

> a = 1:100
> b = runif(100)
Run Code Online (Sandbox Code Playgroud)

现在我可以轻松获得元素:

> a[1]
Run Code Online (Sandbox Code Playgroud)

并行加起来:

> c = a + b
Run Code Online (Sandbox Code Playgroud)

你可以用循环来做,首先初始化c:

> c = rep(0,100)
> for(i in 1:100){
   c[i]=a[i]+b[i]
   }
Run Code Online (Sandbox Code Playgroud)

但那将是懒散的.

几乎每个R初学者都会询问'如何为i'的某些值创建变量a_i,然后不久他们会询问如何为i的某些值访问变量a_i.答案总是将a作为向量或列表.


Ite*_*tor 7

这个东西很简单.对我来说,看起来你想要找到一种自动创建命令并执行它们的方法.十分简单.

例如,这将赋予C_i以下值A_i:

for(i in 1:100){
    tmpCmd = paste("C_",i,"= A_",i, sep = "")
    eval(parse(text = tmpCmd))
}
rm(i, tmpCmd)
Run Code Online (Sandbox Code Playgroud)

只要记住eval(parse(text = ...)))paste(),你是去比赛创建执行命令的循环.

然后,您可以B_i通过交换此行添加您想要执行的操作,即与之相加:

    tmpCmd = paste("C_",i,"= A_",i," + B_",i, sep = "")
Run Code Online (Sandbox Code Playgroud)

然而,其他人是正确的,使用良好的数据结构是一种避免不得不做这样繁琐的事情的方法.然而,当你需要时,这样重复的代码并不难设计.


csg*_*pie 6

我怀疑如果你有一百个变量a_1, a_2, ..., a_100,你的所有变量都是相关的.事实上,如果你想做

c_1 = a_1 + b_1
Run Code Online (Sandbox Code Playgroud)

那么a,b,c是相关的.因此,我建议您将所有变量组合到一个数据框中,其中一列是a另一列,而另一列是b.

问题是如何以合理的方式组合变量.但是,为了给出有用的答案,您能告诉我们这些变量是如何创建的吗?


也许这不适合你的情况.如果没有,更多信息将是有用的.