在R中,data.frame(cbind...)与data.frame(...)有何区别?

3
我想了解一下使用“

”的区别是什么。
data.frame(a,b,c,y)

and

data.frame(cbind(a,b,c,y))

我有三个向量a、b、c,它们包含因子(文本),还有一个存储计数(数字)的变量y。
根据符号表示不同,在运行此模型时我得到了不同的答案。
model.glm <- glm(y ~ a * b * c, data=blabla, family=poisson)

我猜是因为其中一个因素变成了“非因素”,但我不确定。哪种方式是正确的?
2个回答

11

默认情况下,cbind返回一个matrix,它只能有一种数据类型。混合的数据类型(例如数字和字符)通常会被强制转换为字符。例如:

a <- 1:3
b <- c("a", "b", "c")
cb <- cbind(a,b)
cb
     a   b
[1,] "1" "a"
[2,] "2" "b"
[3,] "3" "c"
class(cb)
[1] "matrix"
typeof(cb)
[1] "character"

当您将此传递到data.frame中时,默认情况下,字符将转换为因子(StringsAsFactors = TRUE;将其设置为FALSE以抑制此行为),这些因子基本上是字符串的整数表示。

df <- data.frame(cb)
typeof(df$a)
[1] "integer"
typeof(df$b)
[1] "integer"
class(df$a)
[1] "factor"
class(df$b)
[1] "factor"

我假设这不是你想要的行为,因为 data.frame 可以很好地为您合并元素,并在保持它们原始数据类型(除了将字符串转换为因子外,可以抑制此操作)的同时进行操作,所以我建议使用更简单的 data.frame(a,b) 结构。


1

cbind(a,b,c,y) 返回一个矩阵,不允许多种类型的数据。所以如果 a、b 和 c 是数字,而 y 是因子,则 data.frame(cbind(a,b,c,y)) 只包含因子。

没有使用 cbind(),a、b 和 c 不会被转换为因子。


我在执行一些代码的时候,因为无聊读了这篇帖子,你在这里的答案解决了那天让我非常恼火的事情。先生,你做得很好! - John Chrysostom
因子是一个不好的例子,因为矩阵(据我所知)不能是因子类。请尝试 str(data.frame(cbind(3:4,factor(letters[1:2]))))str(matrix(factor(1:4),ncol=2)) - Frank
是的,但在矩阵中,因子被强制转换为字符。因此,如果 a=1:4b=rep("a",4),那么 cbind(a,b) 只包含字符,而 data.frame(a,b) 不包含与 data.frame(cbind(a,b)) 相同的数据。 - xraynaud
也许我漏掉了什么,但这似乎是不正确的:“data.frame(cbind(a,b,c,y)) 只包含因子”。 - Frank
你是正确的(至少在我的机器上)。cbind(a,b)仅包含字符,由data.frame()强制转换为因子,而data.frame(a,b)具有一个数字列和一个因子列。 - xraynaud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接