【问题标题】:How to create new columns in data.frame on the fly?如何在 data.frame 中动态创建新列?
【发布时间】:2015-06-14 13:31:11
【问题描述】:

类似问题

How to name variables on the fly?

基本上,我想随时随地在 data.frame 中创建一个新列。可能是不好的做法,但对于我正在做的事情来说,这是一个很好的解决方案。

现在我已经试过了:

test <- iris
create.new_var <- function(x) {
  assign(paste("test$", x, sep=""), test$Petal.Width)
  return(test)
}

test <- create.new.var('cheese') 

函数运行时不会中断。但是 data.frame 测试不包含标题为“奶酪”的新列和 iris$Petal.Width 的值,正如人们想象的那样。

【问题讨论】:

    标签: r


    【解决方案1】:

    不建议使用assign 进行此类操作。但是,如果您需要尝试使用assign,一个可能的选择是

     create.new_var <- function(x){
      assign('test', `[[<-`(test, x, value=test$Petal.Width), envir=.GlobalEnv)
     }
     test <- create.new_var('cheese')
     head(test,3)
     #  Sepal.Length Sepal.Width Petal.Length Petal.Width Species cheese
     #1          5.1         3.5          1.4         0.2  setosa    0.2
     #2          4.9         3.0          1.4         0.2  setosa    0.2
     #3          4.7         3.2          1.3         0.2  setosa    0.2
    

    您还可以在函数中添加数据和替换列参数

    create.new_var <- function(dat, x, x1){
      str1 <- deparse(substitute(dat))
      assign(str1, `[[<-`(dat, x, value=dat[,x1]), envir=.GlobalEnv)
    }
    
    test <- create.new_var(test, 'cheese', 'Petal.Width')
    

    这是一个不使用assignpaste的选项(一些被删除的帖子也使用了类似的方法)。

     create.new_var2 <- function(dat, x, x1){ 
                           dat[,x] <- dat[,x1]
                           dat}
    
     create.new_var2(test, 'cheese', 'Petal.Width')
    

    【讨论】:

    • 你的回答很好!但是,我有点失落。其他一些发帖者已经回复然后删除了类似这样的内容:create.new_var
    • @PyPerUser 是的,这将是推荐的方法。但是,我不知道他们为什么删除它。可能是因为在您的帖子中,您想尝试使用assign
    • 我在不需要的时候直接去分配。您的答案的第二部分提供了一些额外的实用程序,允许我更改数据源 - 有没有办法在不使用分配或粘贴的情况下实现它?
    • @PyPerUser 那就是你刚才评论的方法和已删除帖子中的解决方案
    • @PyPerUser 试试create.new_var2 &lt;- function(dat, x, x1){ dat[,x] &lt;- dat[,x1]; dat}; create.new_var2(test, 'cheese', 'Petal.Width')
    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2015-11-08
    • 1970-01-01
    • 2022-08-14
    相关资源
    最近更新 更多