代码之家  ›  专栏  ›  技术社区  ›  Stan

使用Paste()以编程方式指定数据帧并替换索引处的值

r
  •  2
  • Stan  · 技术社区  · 6 年前

    假设我有一个数据帧 x1 :

    x1 <- data.frame(Var1 = 1, Var2 = 2, Var3 = 3)
    

    要编辑单元格,请说第1行 Var1 我会这样做:

    > x1 <- data.frame(Var1 = 1, Var2 = 2, Var3 = 3)
    > x1
      Var1 Var2 Var3
    1    1    2    3
    > x1[1,1] <- 10
    > x1
      Var1 Var2 Var3
    1   10    2    3
    

    现在我的问题是,如何使用paste()来指定这样的数据帧来获得相同的结果: paste0("x", 1) .

    我尝试了以下方法:

    paste0("x", 1)[1,1] <- 10 #obviously won't work

    使用 assign() : assign(paste0("x", 1)[1,1], 10)

    使用 get() : get(paste0("x", 1))[1,1] <- 10

    使用 eval() : eval(parse(paste0("x", 1)))[1,1] <- 10

    在同一错误中解决所有问题:

    分配目标扩展到非语言对象。

    在没有任何解决方法的情况下,我如何才能解决这个问题?

    编辑:

    正如评论中所建议的,以下工作:

    y <- get(paste0("x", 1))
    y[1,1] <- 10
    assign(paste0("x", 1), y)
    

    但我想知道是否有一种直接的方法来做这件事,而不是解决这个问题。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Ronak Shah    6 年前

    我们可以使用 assign 这样:

    assign(paste0("x", 1), `[<-` (x1, 1, 1, 10))
    
    x1
    #  Var1 Var2 Var3
    #1   10    2    3
    

    assign(paste0("x", 1), `[<-` (get(paste0("x",1)), 1, 1, 10))
    
        2
  •  2
  •   Henrik plannapus    6 年前

    您可以使用的功能版本 [<-.data.frame 以下内容:

    `[<-.data.frame`(get(paste0("x", 1)), 1, 1, 10)
    #   Var1 Var2 Var3
    # 1   10    2    3
    

    或者使用通用的替换功能,依靠正确的调度

    `[<-`(get(paste0("x", 1)), 1, 1, 10)
    

    也就是说,与其让(许多)数据帧在工作区中四处浮动,不如将它们存储在(命名的)列表中。