【问题标题】:Convert a dataframe to a vector (by rows)将数据框转换为向量(按行)
【发布时间】:2011-02-02 11:11:11
【问题描述】:

我有一个带有像这样的数字条目的数据框

test <- data.frame(x = c(26, 21, 20), y = c(34, 29, 28))

我怎样才能得到下面的向量?

> 26, 34, 21, 29, 20, 28

我能够使用以下方法获得它,但我想应该有一种更优雅的方式

X <- test[1, ]
for (i in 2:dim(test)[ 1 ]){
   X <- cbind(X, test[i, ])
   } 

【问题讨论】:

    标签: r dataframe vector r-faq


    【解决方案1】:

    你可以试试这个来得到你的组合:

    as.numeric(rbind(test$x, test$y))
    

    将返回:

    26, 34, 21, 29, 20, 28
    

    【讨论】:

      【解决方案2】:

      你可以试试as.vector(t(test))。请注意,如果您想按列进行操作,您应该使用unlist(test)。

      【讨论】:

      • 我无法理解这种解决方法。可以给出更多解释吗? @teucer
      • @verystrongjoe 这里发生了两件事:1) t 将 data.frame 隐式转换为矩阵,2) 矩阵只是具有 dim 属性的特殊向量,并且 as.vector 或 c 删除它
      • 我不得不使用as.numeric(t(df))
      • 如果列具有不同的类,unlist 不起作用。例如,请参阅unlist(data.frame(a= 1:10, b= letters[1:10]))。我最终使用了do.call("c", lapply(data.frame(a= 1:10, b= letters[1:10]), function(i) as.character(i)))
      【解决方案3】:
      c(df$x, df$y)
      # returns: 26 21 20 34 29 28
      

      如果特定顺序很重要,那么:

      M = as.matrix(df)
      c(m[1,], c[2,], c[3,])
      # returns 26 34 21 29 20 28 
      

      或更笼统地说:

      m = as.matrix(df)
      q = c()
      for (i in seq(1:nrow(m))){
        q = c(q, m[i,])
      }
      
      # returns 26 34 21 29 20 28
      

      【讨论】:

      • 是的,顺序很重要,我想按行转换。并且行数远不止 3。因此,如果您可以将其转换为循环或使用矢量化函数会更好。谢谢。
      猜你喜欢
      • 2021-06-25
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 2022-07-06
      相关资源
      最近更新 更多