【问题标题】:converting dataframe columns from matrix to vector将数据框列从矩阵转换为向量
【发布时间】:2015-12-08 02:42:23
【问题描述】:

我正在尝试合并一些数据框。在这样做的过程中,我注意到一个数据帧包含矩阵而不是向量。这是一个基本示例:

df3 <- structure(list(v5 = structure(c(NA, 0), .Dim = c(2L, 1L), .Dimnames = list(
    c("206", "207"), "ecbi1")), v6 = structure(c(NA, 0), .Dim = c(2L, 
1L), .Dimnames = list(c("206", "207"), "ecbi2"))), .Names = c("v5", 
"v6"), row.names = 206:207, class = "data.frame")

# get class
class(df3[,1])
# [1] "matrix"

我希望df3 中的列是向量,而不是矩阵。

【问题讨论】:

    标签: r


    【解决方案1】:

    只应用 as.vector

    df3[] = lapply(df3, as.vector)
    

    【讨论】:

    • 看到了吗?您不必总是先library(dplyr/tidyr),然后再spread %&gt;% gather %&gt;% mutate %&gt;% another_irrelevant_function...
    【解决方案2】:

    我认为最重要的是首先弄清楚您是如何设法获得matrix-type 列的,并了解这是预期的行为还是之前某个错误的副作用。

    根据您所在的位置,您只需使用c 即可撤消给定列:

    df3$v5 <- c(df3$v5)
    

    或者如果这是所有列的问题:

    df3[ ] <- lapply(df3, c)
    

    (lapply 返回向量的list,当我们通过赋值传递listdata.frame 时,它将每个列表元素解释为一列;df3[ ] 返回df3 的所有列. 我们也可以使用df3 &lt;- lapply(df3, c),但是使用[ ] 更健壮——如果我们出错并以某种方式返回错误的列数,则会抛出错误,而简单地使用df3 会简单地覆盖我们的data.frame 静默,以防出现此类错误)

    最后,如果只有一些列是matrix-type,我们可以像这样只替换那些列:

    mat.cols <- sapply(df3, is.matrix)
    df3[ , mat.cols] <- lapply(df3[ , mat.cols], c)
    

    关于这种方法和使用as.vector的方法之间的关系,来自?c

    c 有时用于删除除名称之外的属性的副作用,例如将数组转换为向量。 as.vector 是一种更直观的方法,但也会删除名称。

    因此,鉴于名称在这种情况下意义不大,c 只是一种更简洁的方法,但最终结果实际上是相同的。

    【讨论】:

      【解决方案3】:

      使用这个。

      df3[,1] = as.vector(df3[,1])
      

      相同的过程通常可以应用于其余列。

      【讨论】:

      • @bramtayl 的解决方案正是这个的更好版本。
      【解决方案4】:

      我们可以使用do.call

      do.call(data.frame, df3)
      

      【讨论】:

        猜你喜欢
        • 2018-03-01
        • 2015-01-30
        • 2014-03-09
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 2021-02-09
        • 2017-06-10
        • 1970-01-01
        相关资源
        最近更新 更多