将数据框列从矩阵转换为向量

时间:2015-12-07 16:04:50

标签: r

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

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中的列是向量,而不是矩阵。

4 个答案:

答案 0 :(得分:3)

只需申请as.vector

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

答案 1 :(得分:3)

我认为最重要的是弄清楚你是如何设法获得matrix - 首先输入列,并了解这是否是一个理想的行为,或者是某个错误的副作用。

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

df3$v5 <- c(df3$v5)

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

df3[ ] <- lapply(df3, c)

lapply返回list个向量,当我们将list经过赋值传递给data.frame时,它会将每个列表元素解释为一列; {{ 1}}返回df3[ ]的所有列。我们也可以执行df3,但使用df3 <- lapply(df3, c)更健壮 - 如果我们犯了错误并以某种方式返回错误的列数,将抛出错误,因为在发生此类错误的情况下,只需使用[ ]就会默默地覆盖我们的df3

最后,如果只有一些列是data.frame - 类型,我们只能替换那些列:

matrix

关于此方法与使用mat.cols <- sapply(df3, is.matrix) df3[ , mat.cols] <- lapply(df3[ , mat.cols], c) 的方法之间的关系,来自as.vector

  

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

因此,在这种情况下名称并不多,as.vector只是一种更简洁的方法,但最终结果实际上是相同的。

答案 2 :(得分:1)

使用它。

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

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

答案 3 :(得分:0)

我们可以使用do.call

do.call(data.frame, df3)