【问题标题】:Confused about two dimensional factor in R对R中的二维因子感到困惑
【发布时间】:2019-11-28 14:24:52
【问题描述】:

我有以下数据框:

dat <- data.frame(toys = c("yoyo", "doll", "duckie", "tractor", "airplaine", "ball", "racecar", "dog", "jumprope", "car", "elephant", "bear", "xylophone", "tank", "checkers", "boat", "train", "jacks", "truck", "whistle", "pinwheel"),
                  price = c(1.22, 2.75, 1.85, 5.97, 6.47, 2.16, 7.13, 4.57, 1.46, 5.18, 3.16, 4.89, 7.11, 6.45, 4.77, 8.04, 6.71, 2.31, 6.21, 0.98, 0.87))

我现在想获得 7 到 14 个选定玩具的所有玩具组合。在此线程 (Unordered combinations in R) 之后,我正在使用 arrangements 包中的 combinations 函数:

library(arrangements)
combs <- lapply(7:14, combinations, x = dat$toys)

str(combs)查看结果,它给出了一个长度为8的列表,其中每个列表元素都是一个二维因子,例如

test <- combs[[1]]
dim(test)

但是,如果我现在想将列表元素转换为数据框,它只会给我一个包含一列的数据框,而我希望 as.data.frame(combs[[1]]) 有 7 列。

如果我在上面的组合函数中使用整数或字符向量,一切都会按预期工作,例如与:

combs2 <- lapply(7:14, combinations, x = as.character(dat$toys)) # or
combs3 <- lapply(7:14, combinations, x = 1:21)

test2 <- as.data.frame(combs2[[1]])
test3 <- as.data.frame(combs3[[1]])

我得到了一个包含几列的正确数据框。

为什么我的代码可以处理整数和字符,但不能处理因子?

【问题讨论】:

  • 如何将列表元素转换为数据框?字符或整数向量如何按预期工作?
  • 我调整了上面的帖子。希望它现在更清楚。
  • 我尝试了上面的代码,但我无法复制结果。 as.data.frame(combs[[1]]) 返回一个七列数据框。
  • 澄清一下,这是针对因子情况,而不是字符串/整数情况。
  • 你确定吗?我只是重试并再次获得一个包含 813960 行的因子案例的单列数据框。 (我刚刚编辑了我的帖子以使示例不那么模棱两可,即我将对象名称更改为 combs/combs2/combs3。

标签: r list r-factor


【解决方案1】:

当您调用组合时,底层 c code 会在输出上设置 dim 属性。当它是字符、数字或整数时,将其转换为矩阵,然后您可以从中获取data.frame:

我们可以在 R 中尝试对字符和整数进行此操作(如您所示):

x = 1:4
attr(x,"dim") <- c(2,2)
class(x)
[1] "matrix"
dim(data.frame(x))
1] 2 2

x = as.character(1:4)
attr(x,"dim") <- c(2,2)
class(x)
[1] "matrix"
dim(data.frame(x))
[1] 2 2

请注意,您会得到正确的尺寸和类别(矩阵)。对于因子,它不会抱怨,你得到一个二维因子:

x = factor(1:4)
attr(x,"dim") <- c(2,2)
class(x)
[1] "factor"
str(x)
Factor[1:2, 1:2] w/ 4 levels "1","2","3","4": 1 2 3 4

然而,虽然它看起来像一个矩阵,但它并不是一个矩阵:

x
     [,1] [,2]
[1,] 1    3   
[2,] 2    4   
Levels: 1 2 3 4

但是,将其转换为 data.frame 失败:

as.data.frame(x)
   x.1  x.2
1    1    3
2    2    4
3 <NA> <NA>
4 <NA> <NA>
Warning message:
In format.data.frame(if (omit) x[seq_len(n0), , drop = FALSE] else x,  :
  corrupt data frame: columns will be truncated or padded with NAs

我猜你对 7 到 14 的组合非常幸运。如果你尝试较小的数字,它会失败:

data.frame(combinations(dat$toys,5))
Error in `[.default`(xj, i, , drop = FALSE) : subscript out of bounds
data.frame(combinations(dat$toys,2))
#throws same erros as above

【讨论】:

  • 感谢您的解释。从您的角度来看,这种行为是有意的还是错误的?您是否知道如何获得包含因子的数据框结果?
  • @deschen,我认为这并不意味着因素。拥有一个因素矩阵是没有意义的。因为对于所有逐行和逐列函数,您需要继承矩阵的完整级别。这对你有什么帮助?如果你真的想要一个因子的data.frame,你需要先获取字符,然后遍历每一列,使其成为原始级别的因子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2012-01-04
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多