对R中的二维因子感到困惑
Confused about two dimensional factor in R
我有以下数据框:
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个选定玩具的所有玩具组合。在这个线程 () 之后,我正在使用 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]])
我得到了一个包含多列的正确数据框。
为什么我的代码可以处理整数和字符,但不能处理因数?
当您调用组合时,底层 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
注意上面的内容,您会得到正确的尺寸和 class(矩阵)。对于因子,它没有抱怨,你得到一个二维因子:
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
我有以下数据框:
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个选定玩具的所有玩具组合。在这个线程 (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]])
.
如果我在上面的组合函数中使用整数或字符向量,一切都会按预期工作,例如与:
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]])
我得到了一个包含多列的正确数据框。
为什么我的代码可以处理整数和字符,但不能处理因数?
当您调用组合时,底层 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
注意上面的内容,您会得到正确的尺寸和 class(矩阵)。对于因子,它没有抱怨,你得到一个二维因子:
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