【问题标题】:Calling variable in the loop by using assign and paste0使用assign和paste0在循环中调用变量
【发布时间】:2017-10-09 09:28:26
【问题描述】:

我有一个像这样创建的名为 SAL_mean 的变量(一旦我弄清楚了,我想创建一个循环):

watersheds <- c('ANE', 'SAL', 'CER')
assign(paste0(watersheds[1], '_mean'), read.csv(paste0(watersheds[1], '_mean.csv')))

现在下一步应该是这样的(可行):

cols_dont_want <- c('B1', 'B2', 'B3')
assign(paste0(watersheds[1], '_mean'), SAL_mean[, !names(SAL_mean) %in% cols_dont_want])

但我想问一下如何使用分水岭[1]来替换“SAL_mean”,因为这行代码不起作用:

assign(paste0(watersheds[1], '_mean'), paste0(watersheds[1], '_mean')[, !names(paste0(watersheds[1], '_mean')) %in% cols_dont_want])

我认为它将“paste0(watersheds[2],'_mean')”视为字符串而不是变量名称,但我无法找到解决方案(例如,我尝试了“as.name " 函数但它给了我一个错误 "'symbol' 类型的对象不是子集")

【问题讨论】:

    标签: r


    【解决方案1】:

    使用 ?lapplydataframes 保存在列表中,然后对列表中的多个 dataframes 执行相同的转换会变得更容易,例如:

    # set vars
    watersheds <- c('ANE', 'SAL', 'CER')
    cols_dont_want <- c('B1', 'B2', 'B3')
    
    # result, all dataframes in one list
    myList <- lapply(watersheds, function(i){
      # read the file
      x <- read.csv(paste0(i, "_mean.csv"))
      # exclude columns and return
      x[, !colnames(x) %in% cols_dont_want]
    } )
    

    【讨论】:

    • 谢谢,我会试试这段代码,但问题可能是我的脚本的最终目标是创建和导出绘图 - 使用这个 lapply 函数是否可行?
    • @Marian 是的,有可能,here 就是一个例子。或者我们可以将列表折叠成一个带有 ID 列的数据框,然后使用 facet_grid。
    【解决方案2】:

    或者您可以在 for 循环中执行此操作(有些人认为语法更容易理解)。它相当于 zx8754 的解决方案,除了它根据 OP 为每个数据帧分配名称。修改zx8754的解决方案也很简单。

    watersheds <- c('ANE', 'SAL', 'CER')
    cols_dont_want <- c('B1', 'B2', 'B3')
    ws.list <- list()
    
    for (i in 1:length(watersheds)) {
        ws.list[[i]] <- read.csv(paste0(watersheds[i], '_mean.csv'))
        names(ws.list)[i] <- paste0(watersheds[i], '_mean')
        ws.list[[i]] <- ws.list[[i]][!names(ws.list[[i]]) %in% cols_dont_want]
    }
    names(ws.list)
    # "ANE_mean" "SAL_mean" "CER_mean"
    
    # If you absolutely want to call the data.frames by their 
    # individual names, you can do so after you attach() the list.
    attach(ws.list)
    ANE_mean
    

    【讨论】:

    • 非常感谢,现在我正在尝试通过 for in 循环来完成我的其余代码,因为我更习惯了它。它可能认为我稍后会有另一个问题:)
    【解决方案3】:

    替换

    paste0(watersheds[2], '_mean')

    eval(parse(text = paste0(watersheds[2], '_mean')))

    它应该可以工作。您的猜测是正确的, paste0 只是给您一个字符串,但您需要调用使用 eval() 完成的变量

    【讨论】:

    • 嗨,谢谢,这行得通,但我不知道你为什么有缺点...这是因为这被认为是不好的做法,应该以不同的方式做吗?
    • 是的,我认为这通常被认为是不好的做法。你可以在这里阅读:stackoverflow.com/questions/13649979/…
    • 我在发布该答案时没有想到这一点。我一直在使用 eval(parse( 我自己来动态命名和保存数据帧。我建议你选择@zx8754 的答案
    猜你喜欢
    • 2016-09-28
    • 2019-02-28
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    相关资源
    最近更新 更多