【问题标题】:Loop over multiple variables with same name but different suffix循环多个具有相同名称但不同后缀的变量
【发布时间】:2019-02-21 09:46:26
【问题描述】:

我有一组非常复杂的函数,我需要将它们应用于四个不同的虚拟变量,它们具有相同的核心名称但最后的数字不同。我希望一次性应用这些功能,而不是重复四次。

作为一个例子,这里是一个虚构的数据集,仅用于说明目的:

n <- c(1:100) 
var1 <-NA
var1[n < 20] <- 1
var1[n >50] <- 0
var2 <-NA
var2[n < 30] <- 1
var2[n >50] <- 0
var3 <-NA
var3[n < 10] <- 1
var3[n >40] <- 0
var4 <-NA
var4[n < 20] <- 1
var4[n > 450] <- 0
df <- data.frame(var1, var2, var3, var4, n)

就我需要循环的函数而言,这些变量主要是三个。我需要能够首先对数据框进行子集化,为每个原始变量创建一个新变量,然后将新结果写入数据框。请不要问我为什么需要这样做,它们是更大代码的一部分。

这些是我需要执行的步骤,但全部是 4 个:

df_sub <- subset(df, !is.na(df$var1))

sample1 <- nrow(df_sub[df_sub$var1 == 1,])

if(sample1 < 35) {
a1 <- NA
} else {
a1 <- mean(df_sub$n[df_sub$var1==1])

new_df <- data.frame(a1,a2,a3,a4)

我正在考虑遍历后缀,但我无法弄清楚 R 是如何处理这个问题的。我找到了通过assign() (https://stats.stackexchange.com/questions/10838/produce-a-list-of-variable-name-in-a-for-loop-then-assign-values-to-them) 在循环中创建变量的解决方案 但我仍然无法弄清楚如何处理子集。更一般地说,我将如何遍历变量名中的数字而不是列号、列表等。

或者,如果有一种方法可以创建一个函数,我可以在其中创建变量以导出到该函数之外的环境中,然后将该函数应用于 df 中的 var1 - var4 并仍然获得 4 个不同版本的 a (a1 - a4) 在 new_df 中。

【问题讨论】:

    标签: r loops


    【解决方案1】:

    您可以使用get() 启动循环并更新您工作的变量,然后使用assign()。举个例子:

    for (i in 1:number_of_variables){
         variable=get(paste0("var",i))
    
         ... work on the variable ...
        # Returns
        assign(paste0("df_sub",i), ... your result ...)
    }
    

    【讨论】:

    • 我在尝试运行 get() 时遇到错误 get(paste0("var", i)) 中的错误:找不到对象 'var1'
    • 您是否声明了var1(您是否运行了代码var1 = ...?使用ls() 来检查您的环境中是否存在该变量。
    • 我试过了。它只会接受我声明 var1 为 df$var1 但问题出现在“if”语句中,它应该从 df_sub 获取 var1 但因为它必须从 df 定义(由于 df_sub 在 get() 之前不存在)它实际上在 if 语句中放置了错误的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多