我试图合并一些数据帧。在这样做的过程中,我注意到一个数据帧包含矩阵而不是向量。这是一个基本的例子:
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
中的列是向量,而不是矩阵。
答案 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)