【问题标题】:How to Create Dynamic Variable Names in a For Loop in R如何在 R 的 For 循环中创建动态变量名称
【发布时间】:2018-08-20 21:39:28
【问题描述】:

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

表/数据集中的前 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。

这两行代码中“

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

因为[subset_name] 不起作用。

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

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

提前谢谢你!

【问题讨论】:

  • 不要这样做。将所有类似的结果收集到一个命名列表中。更像这样的东西:stackoverflow.com/questions/17499013/…。从长远来看,这对您来说会容易得多。
  • 另外,在寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。确保定义了所有变量。
  • 我建议使用split 函数将您的原始数据集拆分为包含 24 个子集的列表。使用列表(使用 lapply)比使用 24 个单独的数据框要容易得多。
  • 弗利克先生 - 我上面发布的整个代码可以直接在其他人的计算机上运行,​​只要他们有“behavioural.txt”文件,但是我如何将文本文件放置/附加到这个问题?
  • @Dave2e - 你的意思是这样的吗? my_split_list &lt;- split(behavioural, behavioural$subj)'这会创建一个非常大的列表,但是我如何按每个主题的 'recognition_order' 对其进行排序?

标签: r loops syntax


【解决方案1】:

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

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

【讨论】:

  • 您好,感谢您的回答!不幸的是,我尝试了这段代码,但没有成功。
【解决方案2】:

如果您想对 split 的结果中的项目进行排序,而不仅仅是使用 lapply 传递所需的函数调用以一次对单个数据帧进行排序(由 @ 重新捆绑在一起987654324@下单后:

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

这是一个常见的范例,称为“split-apply-combine”:“The Split-Apply-Combine Strategy for Data Analysis”https://www.jstatsoft.org/article/view/v040i01/v40i01.pdf

【讨论】:

    【解决方案3】:
    for(i in 1:5) {
      assign(paste0("test_",i),i) 
    }
    test_list <- mget(ls(pattern = "test_"))`
    

    我希望你能得到一个好的答案。有一种很好的方法可以创建分配函数并将此模式绑定到 mget。我已经为 R 和 Python 概述了很多关于动态生成变量的问题。附于以下链接。 - Creating Variables Dynamically (R, Python)

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2019-06-14
      • 2021-06-18
      • 1970-01-01
      相关资源
      最近更新 更多