【问题标题】:Assign to a variable data frame in R分配给R中的可变数据框
【发布时间】:2015-05-07 14:35:03
【问题描述】:

我正在尝试将一列数据分配给现有数据框中的新列。数据框从 score.d 循环更改为 score.e。我想要的输出是使用 vals 填充 score.X$new.col,其中 X 替换为当前的 dfname。

dfnames <- c("d","e")
scores.d <- data.frame(x = 1, y = 1:10)
scores.e <- data.frame(x = 2, y = 10:20)
vals <- 60:70

for (i in seq_along(dfnames)){
   assign(get(paste0("scores.",dfnames[i]))$new.col,vals)
}

Error in assign(get(paste0("scores.", dfnames[i]))$new.col, vals) : 
  invalid first argument

这给了我一个错误,因为当我需要它来包含列名时,assign 正在寻找一个字符串作为第一个参数。简单地将 $new.col 添加到粘贴命令是行不通的(假设 $ 不是从字符串转换而来的)。

我是 R 新手,不知道分配事物的注意事项。我想制作一个数据框列表,然后用 val 填充每个数据框,但它不起作用,因为我指定了特定的列,在我的真实数据中,数据框无论如何都是预先存在的,我只是想添加到它们这里。想法?

编辑* @Jason 通过将值分配给临时变量,然后将其分配回来,提供了答案。对于我的目的来说工作正常,但是我已经尝试使用字符串列表来代替通过paste0() 创建名称,但它仍然给了我错误。首先,杰森的工作答案:

dfnames <- c("d","e")
scores.d <- data.frame(x = 1, y = 1:10)
scores.e <- data.frame(x = 2, y = 11:20)
vals <- 61:70

for (i in dfnames){ #don't need seq_along

    dat<-get(paste0("scores.",i)) #pull up the data 
    dat$new.col<-vals
    assign(paste0('scores.',i),dat) #replace old data frame with new
}

现在用一个名称列表替换粘贴过程(注意对 seq_along 的更改):

dfnames <- c("d","e")
scores.d <- data.frame(x = 1, y = 1:10)
scores.e <- data.frame(x = 2, y = 11:20)
vals <- 61:70

# for demonstrative purposes only, these were created in a loop in my code
full.dfnames[1] <- "Scores.d"
full.dfnames[2] <- "Scores.e"

for (i in seq_along(dfnames)){ #added seq_along back for the name index

    dat<-get(full.dfnames[i]) #pull up the data 
    dat$new.col<-vals
    assign(full.dfnames[i],dat) #replace old data frame with new
}

>Error in assign(get(paste0("scores.", dfnames[i]))$new.col, vals) : 
      invalid first argument

【问题讨论】:

  • 首先,我想你会希望 vals=60:69 匹配 x 和 y 列的长度。其次,你想要scores.d$new.col=valsscores.e$new.col=vals 的效果,但语法更快 - 我认为这是一个更大问题的一部分?
  • 不要使用assign() 创建许多变量。而是学习如何使用列表和函数:twitter.com/hadleywickham/status/535931179556691968
  • @Dominik 是的,这是一个大型脚本的一部分,它对两个数据帧上的几列进行多次计算。这是我继承的代码,我正在尝试使用我有限的 Matlab 知识来简化它。每个“vals”都将是该次分数迭代独有的一些计算。X.
  • @Metrics,谢谢你的链接,我去看看。目前我时间紧迫,我要求快速解决。一旦我有空,我会花一些时间来扩展我的知识。

标签: r dataframe assign


【解决方案1】:

我相信以下作品可能不像您希望的那样精简。

dfnames <- c("d","e")
scores.d <- data.frame(x = 1, y = 1:10)
scores.e <- data.frame(x = 2, y = 11:20)
vals <- 61:70

for (i in dfnames){ #don't need seq_along

    dat<-get(paste0("scores.",i)) #pull up the data 
    dat$new.col<-vals
    assign(paste0('scores.',i),dat) #replace old data frame with new

}

【讨论】:

  • 太好了,感谢您的回答。这就是我所尝试的,我保存了一个名称列表,并尝试引用这些名称,但它仍然给我无效的第一个参数错误。请参阅我编辑的问题中的附加示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2022-08-17
  • 2021-07-05
  • 2014-10-09
相关资源
最近更新 更多