如何在R中的For循环中创建动态变量名称

时间:2018-03-12 18:50:07

标签: r loops syntax

我有一个数据集/表格(称为行为),其中包含 24 参与者的数据 - 这些数据的格式为:'s1'到's24'。

表/数据集中的前6行:

head(behavioural)[c(1,17)]
   subj     recognition_order
1   s1                 2
2   s1                 6
3   s1                 7
4   s1                 8
5   s1                 9
6   s1                10

我想为每个参与者创建一个子集,并按变量recognition_order

对每个子集进行排序

我创建了一个循环来执行此操作:

behavioural <- read.table("*my file path*\behavioral.txt", header = TRUE)

subj_counter <- 1


for(i in 1:24) {
subject <- paste("s", subj_counter, sep = "")
subset_name <- paste(subject, "_subset", sep="")

[subset_name] <- behavioural[which(behavioural$subj  == subject), ]
[subset_name] <- subset_name[order(subset_name$recognition_order),]

subj_counter = subj_counter + 1

print(subset_name)
print(subj_counter)
}

我非常确定逻辑是可靠的,除非我运行循环,它创建24个子集。它只创建1 - s24_subset

在这两行代码中,“&lt; - ”之前我需要做什么?

[subset_name] <- behavioural[which(behavioural$subj  == subject), ]
[subset_name] <- subset_name[order(subset_name$recognition_order),]

因为[subset_name]无效。

我希望[subset_name]是动态的 - 即每次循环运行时,其值都会改变,并且每次都会创建一个新的子集/变量。

我在网上看过有关assign()函数的内容但是我不太确定如何将它实现到我的循环中?

提前谢谢!

3 个答案:

答案 0 :(得分:3)

如果要在split的结果中对项目进行排序,而不是仅使用lapply来传递所需的函数调用,以便一次对单个数据帧进行排序(这些是在订购后由lapply捆绑在一起:

my_split_list <- split(behavioural, behavioural$subj)
ord.list <- lapply( my_split_list, function(d){ 
                   d[ order(d[['recognition_order']]) , ] }

这是一种常见的范例叫做&#34; split-apply-combine&#34;:&#34;分裂 - 应用 - 组合战略的数据分析&#34; https://www.jstatsoft.org/article/view/v040i01/v40i01.pdf

答案 1 :(得分:0)

您可以使用eval()parse()完成此操作,如下所示:

eval(parse(text = paste(subset_name, "<- subset_name[order(subset_name$recognition_order),]", sep = '')))

答案 2 :(得分:0)

for(i in 1:5) {
  assign(paste0("test_",i),i) 
}
test_list <- mget(ls(pattern = "test_"))`

希望您得到一个好的答案。有一个很好的方法来创建一个assign函数并在mget中绑定该模式。我已经为R和Python概述了有关动态生成变量的许多问题。附加到以下链接。 -Creating Variables Dynamically (R, Python)