【问题标题】:cbind coerces a data frame to matrixcbind 将数据框强制转换为矩阵
【发布时间】:2015-05-01 21:32:11
【问题描述】:

我在使用 cbind 时遇到问题。在使用 cbind 之前,对象是两个字符向量的 data.frame。

使用 cbind 添加列后,data.frame 对象将类更改为矩阵。我试过 as.vector,将 h 声明为空字符向量等,但无法修复它。感谢您的任何建议和帮助。

output <- data.frame(h = character(), st = character()) ## empty dataframe
st <- state.abb 
h <- (rep("a", 50))
output <- cbind(output$h, h) ## output changes to matrix class here
output <- cbind(output, st) ## adding a second column

【问题讨论】:

  • ?cbind如果至少一个参数是数据框,其余是向量或矩阵,则将使用数据框方法。您将两个向量传递给cbind,因此结果不是数据框
  • 谢谢。这就是为什么我首先创建了空的 data.frame,认为这样可以在我不断向其中添加其他列的同时将其保留为数据框。
  • output 是一个数据框。 output$h 不是数据框。因此cbind(output$h, h) 不会调用任何特定于数据帧的魔法。

标签: r dataframe cbind


【解决方案1】:

我猜你可能不需要cbind()

output <- data.frame(state = state.abb, h = rep("a", 50))
head(output)
state h
1    AL a
2    AK a
3    AZ a
4    AR a
5    CA a
6    CO a

@ Ken 我不确定您真正想要获得什么,但如果将变量保存在列表中可能会更容易。下面是一个例子。

state <- state.abb
h <- rep("a", 50)

lst <- list(state = state, h = h)
mat <- as.matrix(do.call(cbind, lst))
head(mat)
state h  
[1,] "AL"  "a"
[2,] "AK"  "a"
[3,] "AZ"  "a"
[4,] "AR"  "a"
[5,] "CA"  "a"
[6,] "CO"  "a"

df <- as.data.frame(do.call(cbind, lst))
head(df)
state h
1    AL a
2    AK a
3    AZ a
4    AR a
5    CA a
6    CO a

【讨论】:

  • 谢谢...虽然我计划添加更多列。这使得转换为矩阵变得很麻烦。
  • 你想获取哪个:数据框还是矩阵?
  • 我想在所有 cbind 之后获得一个 data.frame。我想我需要在 cbinds 完成后从矩阵转换为 data.frame 吗?谢谢!
  • 如果要绑定多个变量,请在创建这些变量的列表后使用do.call()。我希望我编辑的代码的第二个示例有用。
  • 这在构建数据框时有点令人费解。肯你可以添加你正在尝试做的事情的细节,而不是如何做。一般来说,从data.frame(h = character(), st = character()) 开始并不是一个好的开始方式。 Jaehyeon,第一个答案更好,然后你可以使用cbind,但澄清一下就好了。
【解决方案2】:

作为信息的补充,请注意您可以使用单括号表示法使其与原始代码接近:

数据

output <- data.frame(h = letters[1:5],st = letters[6:10])
h2 <- (rep("a", 5))

这行不通

cbind(output$h, h2)
#          h2  
# [1,] "1" "a"
# [2,] "2" "a"
# [3,] "3" "a"
# [4,] "4" "a"
# [5,] "5" "a"
class(cbind(output$h, h2)) # matrix

这是一个矩阵,因子被强制转换成数字

这会起作用

cbind(output["h"], h2)
#   h h2
# 1 a  a
# 2 b  a
# 3 c  a
# 4 d  a
# 5 e  a
class(cbind(output["h"], h2)) # data.frame

请注意,使用双括号 (output[["h"]]),您将得到与使用美元符号时相同的不足结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多