【问题标题】:data.frame(cbind...) versus data.frame(...) in RR 中的 data.frame(cbind...) 与 data.frame(...)
【发布时间】:2023-03-31 17:45:01
【问题描述】:

我想了解一下

的用法有什么区别
data.frame(a,b,c,y)

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

我有三个向量 a,b,c 包含因子(文本)和一个 (y) 存储计数(数字)。

根据符号的不同,我在运行此模型时会得到不同的答案

model.glm <- glm(y ~ a * b * c, data=blabla, family=poisson)

我想这是因为其中一个因素是“无因素”,但我不确定。 哪种方式正确?

【问题讨论】:

    标签: r


    【解决方案1】:

    默认情况下,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 会很好地为您提供cbind 的东西,同时保持它们的原始类型(除了将字符串转换为因子,其中,正如我所说,可以抑制),我会坚持使用更简单的data.frame(a,b) 构造。

    【讨论】:

      【解决方案2】:

      cbind(a,b,c,y) 返回一个不允许多种数据类型的矩阵。因此,如果说 a、b 和 c 是数字并且 y 是一个因子,那么 data.frame(cbind(a,b,c,y)) 只包含因子。

      如果没有cbind(),a、b 和 c 不会转换为因子。

      【讨论】:

      • 我在执行一些代码时因为无聊而阅读了这篇文章,而您在这里的回答解决了前几天真正让我生气的问题。先生,你好!
      • 因子是一个不好的例子,因为矩阵(据我所知)不能属于类因子。试试str(data.frame(cbind(3:4,factor(letters[1:2]))))str(matrix(factor(1:4),ncol=2))
      • 是的,但是因子被强制转换为矩阵中的字符。所以如果`a=1:4`和b= rep("a",4),那么cbind(a,b)只包含字符,data.frame(a,b)不包含与data.frame(cbind(a,b))相同的数据
      • 也许我遗漏了什么,但这似乎不正确:“data.frame(cbind(a,b,c,y)) 仅包含因子”
      • 你是对的。 (至少在我的机器上), cbind(a,b) 仅包含由 data.frame() 强制转换为因子的字符,而 data.frame(a,b) 具有一列数​​字和一列因子。
      猜你喜欢
      • 2020-07-09
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多