【问题标题】:Convert data.frame column to a vector?将 data.frame 列转换为向量?
【发布时间】:2011-10-27 13:31:30
【问题描述】:

我有一个数据框,例如:

a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)

我尝试了以下方法将其中一列转换为向量,但它不起作用:

avector <- as.vector(aframe['a2'])
class(avector) 
[1] "data.frame"

这是我能想出的唯一解决方案,但我假设必须有更好的方法来做到这一点:

class(aframe['a2']) 
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"

注意:我上面的词汇可能有误,如果有,请纠正我。我仍在学习 R 的世界。此外,对这里发生的事情的任何解释表示赞赏(即与 Python 或其他语言有关的任何解释都会有所帮助!)

【问题讨论】:

  • 正如您在答案中看到的那样,仔细阅读 ?'[.data.frame' 会让您走得很远。

标签: r dataframe vector type-conversion


【解决方案1】:

我将尝试在不犯任何错误的情况下解释这一点,但我敢打赌这将在 cmets 中引起一两个澄清。

数据框是一个列表。当您使用列名称和[ 对数据框进行子集化时,您将得到一个sublist(或子数据框)。如果你想要实际的原子列,你可以使用[[,或者有点令人困惑(对我来说)你可以使用aframe[,2],它返回一个向量,而不是一个子列表。

所以尝试运行这个序列,也许事情会更清楚:

avector <- as.vector(aframe['a2'])
class(avector) 

avector <- aframe[['a2']]
class(avector)

avector <- aframe[,2]
class(avector)

【讨论】:

  • +1 这很有用。我已经习惯了使用aframe[,"a2"],因为它能够同时用于数据框和矩阵,并且似乎得到了相同的结果——一个向量。
  • [..., drop = F] 总是会返回一个数据框
  • 知道这一点特别好,因为df$x 语法返回一个向量。我使用这种语法很长一段时间,但是当我不得不开始使用 df['name']df[n] 来检索列时,当我试图将它们发送到预期向量的函数时遇到了问题。使用df[[n]]df[['x']] 可以解决问题。
  • 为什么as.vector好像默默没有效果?这不应该返回一个向量还是明显失败?
  • aframe[['a2']] 对于sf 对象非常有用,因为aframe[,"a2"] 将返回两列,因为包含几何列。
【解决方案2】:

现在有一种使用dplyr 的简单方法。

dplyr::pull(aframe, a2)

【讨论】:

    【解决方案3】:

    你可以使用$提取:

    class(aframe$a1)
    [1] "numeric"
    

    或双方括号:

    class(aframe[["a1"]])
    [1] "numeric"
    

    【讨论】:

      【解决方案4】:

      您不需要as.vector(),但您确实需要正确的索引:avector &lt;- aframe[ , "a2"]

      要注意的另一件事是drop=FALSE 选项到[

      R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15)
      R> aframe
        a1 a2 a3
      1  1  6 11
      2  2  7 12
      3  3  8 13
      4  4  9 14
      5  5 10 15
      R> avector <- aframe[, "a2"]
      R> avector
      [1]  6  7  8  9 10
      R> avector <- aframe[, "a2", drop=FALSE]
      R> avector
        a2
      1  6
      2  7
      3  8
      4  9
      5 10
      R> 
      

      【讨论】:

      • +1:drop=FALSE 的提醒很有用 - 在我可以从 data.frame 中选择 N 列的情况下,在 N=1 的情况下,这对我很有帮助。
      • 当我无法预见选择的列数并且如果出现一列时,我会使用它,结果仍然作为具有 n 列的 data.frame 传递。向量可能会将活动扳手扔到函数中。
      【解决方案5】:

      你可以试试这样的-

      as.vector(unlist(aframe$a2))
      

      【讨论】:

      • 如果您想使用identical比较两列,这很好。
      【解决方案6】:

      使用 '[[' 运算符的另一个优点是它同时适用于 data.frame 和 data.table。因此,如果必须为 data.frame 和 data.table 运行该函数,并且您想从中提取一列作为向量,那么

      data[["column_name"]] 
      

      最好。

      【讨论】:

      • 简单!谢谢!
      【解决方案7】:
      as.vector(unlist(aframe['a2']))
      

      【讨论】:

        【解决方案8】:
        a1 = c(1, 2, 3, 4, 5)
        a2 = c(6, 7, 8, 9, 10)
        a3 = c(11, 12, 13, 14, 15)
        aframe = data.frame(a1, a2, a3)
        avector <- as.vector(aframe['a2'])
        
        avector<-unlist(avector)
        #this will return a vector of type "integer"
        

        【讨论】:

          【解决方案9】:

          如果您只使用提取运算符,它将起作用。默认情况下,[] 设置选项drop=TRUE,这就是你想要的。详情请见?'['

          >  a1 = c(1, 2, 3, 4, 5)
          >  a2 = c(6, 7, 8, 9, 10)
          >  a3 = c(11, 12, 13, 14, 15)
          >  aframe = data.frame(a1, a2, a3)
          > aframe[,'a2']
          [1]  6  7  8  9 10
          > class(aframe[,'a2'])
          [1] "numeric"
          

          【讨论】:

            【解决方案10】:

            我使用列表来过滤数据帧,根据它们是否具有值 %in% 一个列表。

            我一直在通过将 1 列数据框导出到 Excel 中手动创建列表,在其中我将在每个元素周围添加“”,然后粘贴到 R 中:list

            在搜索 stackoverflow 并没有找到将 1 列数据框转换为列表的直观方法后,我现在发布我的第一个 stackoverflow 贡献:

            # assuming you have a 1 column dataframe called "df"
            list <- c()
            for(i in 1:nrow(df)){
              list <- append(list, df[i,1])
            }
            View(list)
            # This list is not a dataframe, it is a list of values
            # You can filter a dataframe using "subset([Data], [Column] %in% list")
            

            【讨论】:

              【解决方案11】:

              我们还可以将 data.frame 列一般地转换为简单向量。 as.vector 还不够,因为它保留了 data.frame 类和结构,所以我们还必须拉出第一个(也是唯一的)元素:

              df_column_object <- aframe[,2]
              simple_column <- df_column_object[[1]]
              

              目前建议的所有解决方案都需要对列标题进行硬编码。这使得它们非泛型(想象将其应用于函数参数)。

              或者,您当然可以先从列中读取列名,然后将它们插入到其他解决方案的代码中。

              【讨论】:

                猜你喜欢
                • 2020-06-21
                • 1970-01-01
                • 2013-05-24
                • 2014-06-07
                • 2012-12-05
                • 1970-01-01
                相关资源
                最近更新 更多