【问题标题】:use name to call data.fame and create a column on it:使用 name 调用 data.fame 并在其上创建一个列:
【发布时间】:2013-07-10 12:39:09
【问题描述】:

我一直在尝试做类似的事情:

get(names[i])$column1<-vector

或者更准确地说,在我的情况下,get(names[i])@data&lt;-data.frame

我一直在为get()assign() 寻找类似的东西而苦苦挣扎……但不知道该怎么做

示例:

names<-c("york","paris","donostia")
vector<- 1:8
data<- as.data.frame(matrix(rep(0,9),ncol=3))

我该怎么做?

【问题讨论】:

    标签: r dataframe assign names


    【解决方案1】:

    让我们从您的示例 data.frame 开始:

    data <- as.data.frame(matrix(rep(0,9),ncol=3))
    
    > data
      V1 V2 V3
    1  0  0  0
    2  0  0  0
    3  0  0  0
    

    如果我理解您的问题,您想添加一列,但您希望通过包含其名称的变量引用您的 data.frame。

    语法df$foo &lt;- x 便于应用名为$&lt;- 的函数,该函数接受data.frame df、列名和新列并返回新data.frame。神奇的部分是它以原始变量df 捕获返回值。

    考虑到这一点,这就是我认为你所追求的:

    name <- 'data'
    assign(name, `$<-`(get(name), 'new.column', letters[1:3]))
    
    > data
      V1 V2 V3 new.column
    1  0  0  0          a
    2  0  0  0          b
    3  0  0  0          c
    

    【讨论】:

      【解决方案2】:

      我以为一切都结束了。我想我简化了我的问题,我的数据发生了一些非常奇怪的事情。

      我实际上正在使用 SpatialPolygonsDataFrame,我正在尝试替换对象 (object@data) 内部的 data.frame。

      所以开头是我从别人那里得到的一个例子:

          ################ data ################
          library(sp)
          grd <- GridTopology(c(1,1), c(1,1), c(3,3))
          polys <- as.SpatialPolygons.GridTopology(grd)
          centroids <- getSpPPolygonsLabptSlots(polys)
          x <- centroids[,1]
          y <- centroids[,2]
          z <- 1.4 + 0.1*x + 0.2*y + 0.002*x*x
          map <- SpatialPolygonsDataFrame(polys, 
                                   data=data.frame(x=x, y=y, z=z,                                 row.names=getSpPPolygonsIDSlots(polys)))
      
      
          ########## my case ##############
          new.data1<-data.frame(x=x, y=y, z=z*2, row.names=getSpPPolygonsIDSlots(polys))
          new.data2<-data.frame(x=x, y=y, z=z/2, row.names=getSpPPolygonsIDSlots(polys))
          names<-c("new.data1","new.data2")
          maps<-c("map1","map2")
      
          for(i in 1:length(names)){
            assign(maps[i],map) ### I copy the map in each of the maps I want
      
            ### and here I try to copy the new data.frames in the data slot of my maps
            assign(maps[i],`@<-`(get(maps[i]),"data",get(names[i])))
          }
      
          #### check
          identical(get(maps[1]),get(maps[2]))
      

      我以为一切都很好,但相反,我发现不同地图中的两个 data.frame 是相同的。我在行中说的话有点迷失了:

      assign(maps[i],@&lt;-(get(maps[i]),"data",get(names[i])))

      我认为这应该是问题所在。为什么最后一行将相同的data.frame(姓氏[i])分配给两个新地图(map1和map2)????

      非常感谢

      【讨论】:

      • 在这种情况下,您的本地环境具有名为“map1”和“map2”的条目,它们都指向同一个对象(无论从 SpatialPolygonsDataFrame 返回什么)。没有两个“地图”,只有同一张地图的两个名称。
      • 我不确定你的目标,但使用 assign 可能不是最好的方法。看起来您想要一个简单的旧地图列表。
      【解决方案3】:

      按照这些思路编写代码可以解决问题吗?

      maps <- list()
      for (name in ['city1', 'city2', ...etc...]) {
        data <- getDataForThisParticularMap(name)
        maps <- append(maps, list(SpatialPolygonsDataFrame(...etc..., data=data)))
      }
      

      如果您的总体目标是不同地图对象的列表,这就是您想要的。

      【讨论】:

      • 是的,我认为这是可行的。我必须找到一个编程教程来理解你对环境的指出。非常感谢 cbare
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      相关资源
      最近更新 更多