【问题标题】:Split dataframe columns into vectors in R将数据框列拆分为 R 中的向量
【发布时间】:2021-12-29 15:41:19
【问题描述】:

我有一个这样的数据框:

Number <- c(1,2,3)
Number2 <- c(10,12,14)
Letter <- c("A","B","C")
df <- data.frame(Number,Number2,Letter)

我想将 df 拆分为各自的三列,每一列都成为具有各自列名的向量。本质上,输出应该看起来与上面示例中的原始三个输入向量完全相同。

我尝试了 split 功能,也使用了 for 循环,但没有成功。

有什么想法吗?谢谢。

【问题讨论】:

    标签: r dataframe vector split


    【解决方案1】:

    我们可以使用unclass,因为data.frame 是带有附加属性的list。通过unclassing,它删除了data.frame 属性

    unclass(df)
    

    或者另一个选项是asplitMARGIN 指定为 2

    asplit(df, 2)
    

    注意:它们都返回 named list。如果我们打算在全局环境中创建新对象,请使用list2env(虽然不推荐)

    【讨论】:

    • 谢谢。这很好用。不过,我如何将列表中的参数放入我的环境中的单独向量中?
    • @jestor 正如我提到的list2envlist2env(df, .GlobalEnv),不推荐这样做,因为它会在全局环境中创建大量对象
    【解决方案2】:

    我们可以使用cas.list

    > c(df)
    $Number
    [1] 1 2 3
    
    $Number2
    [1] 10 12 14
    
    $Letter
    [1] "A" "B" "C"
    
    > as.list(df)
    $Number
    [1] 1 2 3
    
    $Number2
    [1] 10 12 14
    
    $Letter
    [1] "A" "B" "C"
    

    【讨论】:

      【解决方案3】:

      假设您在全局环境中尝试将这些创建为向量,请使用list2env

      df <- data.frame(Number = c(1, 2, 3), 
                       Number2 = c(10, 12, 14), 
                       Letter = c("A", "B", "C"))
      
      list2env(df, .GlobalEnv)
      ## <environment: R_GlobalEnv>
      ls()
      ## [1] "df"      "Letter"  "Number"  "Number2"
      

      【讨论】:

        【解决方案4】:

        list2env 显然是最简单的方法,但如果你想用 for 循环来做也可以实现。

        “棘手”的部分是根据 for 循环内的列名创建一个新向量。如果你只是写

         names(df[i]) <- input 
        

        不会创建向量。

        一种解决方法是使用粘贴创建一个带有新向量名称的字符串以及其中应包含的内容,然后使用“eval(parse(text=)”来评估此表达式。

        也许不是最优雅的解决方案,但似乎可行。

        for (i in colnames(df)){
          vector_name <- names(df[i])
          expression_to_be_evaluated <- paste(vector_name, "<- df[[i]]")
          eval(parse(text=expression_to_be_evaluated))
        }
        
        > Letter
        [1] A B C
        Levels: A B C
        > Number
        [1] 1 2 3
        > Number2
        [1] 10 12 14
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-29
          • 1970-01-01
          相关资源
          最近更新 更多