我对SAS编程环境非常熟悉.我目前正在尝试学习使用R编程.我发现使用SAS宏可以减少编程中重复代码的数量.特别是,我发现使用宏变量有用的调整数据集名称和变量名称的部分.然而,在RI中没有找到可以复制这个的东西.
例如,在SAS中,我可以编写一个简单的宏来在两个数据集上运行proc,如下所示:
%macro means(dataset_suffix = , var1_suffix= );
proc means data = data&dataset_suffix;
var var1&var1_suffix;
run;
%mend means;
%means(dataset_suffix = _suf1, var1_suffix = _suf2);
%means(dataset_suffix = _suf3, var1_suffix = _suf4);
Run Code Online (Sandbox Code Playgroud)
运行此代码会执行两次宏,从而导致运行以下代码
proc means data = data_suf1;
var var_suf2;
run;
proc means data = data_suf3;
var var_suf4;
run;
Run Code Online (Sandbox Code Playgroud)
我已经研究了R的用户定义函数以及使用列表.我知道R中没有一个与proc手段直接相似的程序.然而,我的问题的焦点是如何使用宏变量来引用R中具有相似前缀但不同后缀的不同对象.我也考虑过使用粘贴功能.任何有关这方面的帮助将非常感激.
我有一个冗长的数组,其中每个元素都有逗号分隔的数据.每个元素中的第一条数据是标识符ID.其余数据由两组数据组成.我们将它们称为X和Z.这是一个例子.
我的数组看起来像这样:
ABC,1,1.5,2,2.4,3,3.1
DEF,1,1.7,2,0.9
GHI,3,8.2
JKL,1,1.5,2,2.4,3,3.13,8.2
Run Code Online (Sandbox Code Playgroud)
我希望它将它转换为如下所示的数据框:
ID X Z
1 ABC 1 1.5
2 ABC 2 2.4
1 ABC 1 1.5
2 ABC 2 2.4
3 ABC 3 3.1
4 DEF 1 1.7
5 DEF 2 0.9
6 GHI 3 8.2
7 JKL 1 1.5
8 JKL 2 2.4
9 JKL 3 3.1
10 JKL 3 8.2
Run Code Online (Sandbox Code Playgroud)
我写了一个循环(粘贴在下面),它将为我做这个,但它是非常低效的.我的数组接近1,000,000个元素,并且循环正在进行中.任何的意见都将会有帮助.我仍然熟悉应用函数,但我不知道在这种情况下如何写一个.
在此代码中,具有原始数据的数组称为"行".
#write a function to test if an itteration is even
is.even <- function(x) x %% 2 == 0
#create the …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的数据表.
ID <- c(rep("ABC",4), rep("DEF",4), rep("GHI",5))
X <- c(rep(c(1,2,3,4),3),5)
set.seed(1234)
Z <- runif(13,min=0, max =1)
a <- data.table(ID, X, Z)
a
ID X Z
1: ABC 1 0.113703411
2: ABC 2 0.622299405
3: ABC 3 0.609274733
4: ABC 4 0.623379442
5: DEF 1 0.860915384
6: DEF 2 0.640310605
7: DEF 3 0.009495756
8: DEF 4 0.232550506
9: GHI 1 0.666083758
10: GHI 2 0.514251141
11: GHI 3 0.693591292
12: GHI 4 0.544974836
13: GHI 5 0.282733584
Run Code Online (Sandbox Code Playgroud)
我想生成一个在每个X子组中具有N个最高值Z的数据帧.所以我们说N是2.我想最终得到一个如下所示的数据集:
X ID Z …Run Code Online (Sandbox Code Playgroud)