【问题标题】:R - Unbind DataframeR - 解除绑定数据框
【发布时间】:2021-03-20 16:23:02
【问题描述】:

我正在尝试将数据帧 (df) 拆分为其组成向量

示例数据框

v1 <- c(213, 225, 435)
v2 <- c(333, 888, 999)
v2 <- c(788, 666, 545)

df <- data.frame(v1, v2, v3)

当前语法:

for (i in 1:3) {
  assign(paste('v', i, sep = '')) <- df$v[c(i)]
}

所需的输出只是:

v1、v2、v3

有没有办法使用 lapply 做到这一点?有没有办法使用 for 循环来做到这一点?

【问题讨论】:

    标签: r for-loop lapply


    【解决方案1】:

    assign 中,我们指定value 参数和x(对象名称为字符串)。 v[c(i)] 也不正确,因为 i 是一个数字索引,它试图对不存在的 v 进行子集化。里面将使用相同的paste 来创建列名以及用于动态子集的[[

    for (i in 1:3) {
      assign(paste('v', i, sep = ''), value = df[[paste0("v", i)]])
     }
    

    或者代替两次调用paste,可以这样做

    for(i in 1:3) {
        nm1 <- paste0("v", i)
        assign(nm1, value = df[[nm1]])
    }
    

    或者另一种选择是

    rm(list = paste0('v', 1:3)) # // remove the objects created in the env
    list2env(df, .GlobalEnv)
    v1
    #[1] 213 225 435
    v2
    #[1] 788 666 545
    v3
    #[1] 788 666 545
    

    或者也可以使用attach。最好不要在全局环境中创建多个对象。相反,它可以在 listdata.frame 中(如果对象长度相等)

    【讨论】:

      【解决方案2】:

      使用split.default 将每一列拆分为不同的数据框。

      res <- split.default(df, names(df))
      res
      
      #$v1
      #   v1
      #1 213
      #2 225
      #3 435
      
      #$v2
      #   v2
      #1 333
      #2 888
      #3 999
      
      #$v3
      #   v3
      #1 788
      #2 666
      #3 545
      

      如果您需要将它们作为单独的对象,请使用 list2env

      list2env(res, .GlobalEnv)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        • 2011-08-13
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多