R中使用do循环来创建新的变量(Using do loops in R to create new

2019-06-23 19:03发布

我是一个很长一段时间SAS程序员寻找使跳转到R.我知道R是不是所有的变量重新编码是伟大的,但有没有办法做到与循环来做到这一点。

如果我有很多的命名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;

谢谢!

Answer 1:

SAS采用的是基本的宏语言,它依赖于文本替换,而不是像评价任何适当的编程语言表达的。 您SAS文件基本上是两件事情:SAS命令,宏表达式(事以“%”)。 宏语言是非常有问题的,很难调试(例如,执行表达式中的表达式得到扩展?你为什么要做“&& X”,甚至“&&& X”?为什么你需要两个分号这里?)。 相比于基于单一的语法精心设计的编程语言,它的笨拙和不雅。

如果您A_I变量是单数,那么你应该让他们作为一个向量 - 例如:

> a = 1:100
> b = runif(100)

现在,我可以得到元素容易:

> a[1]

和并行加起来:

> c = a + b

你可以用一个循环做到这一点,首先初始化C:

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

但是,这将是sloooooow。

几乎每一个[R初学者问“我该如何创建一些值的变量A_I的我”,然后不久之后,他们问如何访问变量A_I对我的一些价值观。 答案是永远做一个无论是作为载体或列表。



Answer 2:

这东西实在是微不足道。 对我来说,它看起来像你想找到一种方法来自动创建并执行命令。 十分简单。

举例来说,这就赋予C_i在价值A_i

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

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

然后,您可以添加在操作你想要做的,即用总和B_i ,在这一行交换:

    tmpCmd = paste("C_",i,"= A_",i," + B_",i, sep = "")

然而,其他人是正确的,使用良好的数据结构是为了避免不得不做了很多这样的事情繁琐的方式。 然而,当你需要,这种重复的代码并不难制定。



Answer 3:

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

c_1 = a_1 + b_1

然后abc是相关的。 因此,我建议你把你所有的变量组合成一个单一的数据帧,其中一列是a ,另一个是b

现在的问题是你如何在一个合理的方式组合的变量。 然而,给一个有用的答案,你能告诉我们如何创建这些变量?


也许,这是不适合的,对于你的情况。 如果不是,更多的信息将是有益的。



Answer 4:

这确实是晚了,但实际上你可以做到这一点没有循环或*适用。 我假设变量是在数据帧(这是有道理的,如果OP熟悉SAS数据集和宏)列。

df[paste("c", 1:100, sep="_")] <- df[paste("a", 1:100, sep="_")] +
                                  df[paste("b", 1:100, sep="_")]


Answer 5:

这实际上是一个非常有趣的问题。 从我的阅读和最近的(强制)使用SAS的,这个问题似乎是试图将一个内重新编写的SAS数据集的变量data使用位的宏代码的一步。 否则,如果正在创建它们自由变量,他们将有开始&字符。 我想示例代码实际上将更好的体现,如:

%macro recodevars;
data test;
  set test;

  %do i=1 %to 100;
  c_&i = a_&i + b_&i;
  %end;

run;
%mend recodevars;
%recodevars;

你可以做同样的事情在像这样的例子R:

test <- data.frame(vara1=1:10,varb1=2:11,vara2=3:12,varb2=4:13)

test[paste0("varc",1:2)] <- test[paste0("vara",1:2)] + test[paste0("varb",1:2)]

我很好奇,想知道有什么见解别人要回答这个问题,如果它被应用到数据帧,而不是自由变量。



Answer 6:

将R的方式是使用列表。

> a_1 = 1
> a_2 = 2
> a_3 = 3
> a_4 = 4
> a_5 = 5

> b_1 = 1
> b_2 = 2
> b_3 = 3
> b_4 = 4
> b_5 = 5

> a.list <- ls(patter='a_*')
> a.list
[1] "a_1" "a_2" "a_3" "a_4" "a_5"

并定义blist为好。

if(length(a.list)==length(b.list)){
   c.list <- lapply(1:length(a.list), function(x) eval(parse(text=a.list[x])) + eval(parse(text=b.list[x])))

   c.list.names <- paste('c', 1:length(a.list), sep='_')

   lapply(1:length(c.list), function(x) assign(c.list.names[x], c.list[x], envir=.GlobalEnv)) 
}

我不能想办法做到这一点没有eval(parse(yuk))assign ,除非您按照csgillespie的建议(这是正确的方式!)



文章来源: Using do loops in R to create new variables
标签: r sas