我试图在R中创建一个包含度量,二项式和分类变量的随机数据集。但是,最后当我检查我的分类变量的类时,R表示它们是数字的,但我需要它们作为我进一步分析的因素。有没有人知道我在这里做错了什么? 这是我的代码:
set.seed(3456)
R.dat <- function(n = 5000,metr=1,bin=1,cat=3) {
j <- metr
X <- (matrix(0,n,j))
for (i in 1:n) {
X[i,] <- rnorm(j, mean = 0, sd = 1)
}
BIN <- matrix(0,n,bin)
for (i in 1:bin) {
BIN[,i] <- rbinom(n,1, 0.5)
}
CAT <- matrix(0,n,cat)
for (i in 1:cat) {
CAT[,i] <- factor(sample(1:4, n, TRUE))
}
X <- as.data.frame(cbind(X,BIN, CAT))
return(X)
}
Dat <- R.dat(n=5000,metr=1,bin=1, cat=3)
summary(Dat)
如果我只是这样的样本:
x <- factor(sample(1:4, n, TRUE))
class(x)
它说x是一个因素,所以当我在函数和循环中使用它时,我不知道它为什么不这样做...任何帮助都非常赞赏,提前感谢!
答案 0 :(得分:1)
执行此操作时:
CAT <- matrix(0,n,cat)
for (i in 1:cat) {
CAT[,i] <- factor(sample(1:4, n, TRUE))
}
创建数值矩阵CAT
,然后为该矩阵的子集分配新值。当您执行该分配时,新值强制为CAT
类型,这是数字。
此外,当您cbind
矩阵X
,BIN
和CAT
结尾时,您将所有矩阵强制为共同类型。这会再次弄乱你的变量类型,即使假设到目前为止一切正常。
您的其余代码也可以大大简化。特别是,您不需要循环来将值重新分配给矩阵;您可以直接在值向量上调用matrix
构造函数。
请改为尝试:
R.dat <- function(n=5000, metr=1, bin=1, cat=3)
{
X <- matrix(rnorm(n * metr), nrow=n)
B <- matrix(rbinom(n * bin, 1, 0.5), nrow=n)
F <- matrix(as.character(sample(1:4, n * cat, TRUE)), nrow=n)
data.frame(X=X, B=B, F=F)
}
答案 1 :(得分:0)
因为矩阵不接受因子向量,所以它将被强制转换为数字。 只需将其更改为数据框:
CAT <- matrix(0,n,cat)
CAT <- as.data.frame(CAT)
这样就可以了。
答案 2 :(得分:0)
您不需要循环,如果切换到data.table
,则可以通过引用生成它们。
library(data.table)
n <- 10
bin <- 1
DT <- data.table(X=replicate(n, rnorm(bin, mean=0, sd = 1)),
BIN = rbinom(n,1, 0.5),
CAT = factor(sample(1:4, n, TRUE)))
## If you need you can add more columns
cols <- paste0("CAT", 1:3)
DT[, (cols):= lapply(rep(n, 3) ,rbinom, 1, .5) ]
cols <- paste0("BIN", 1:3)
DT[, (cols):= lapply(rep(n, 3) ,function(x){factor(sample(1:4, n, TRUE)) }) ]
DT
lapply(DT, class)
DT
X BIN CAT CAT1 CAT2 CAT3 BIN1 BIN2 BIN3
1: 1.2934720 1 2 0 0 0 1 1 2
2: -0.1183180 1 2 0 0 1 3 3 1
3: 0.3648810 1 2 1 1 1 3 2 3
4: -0.2149963 1 2 1 1 0 2 3 2
5: 0.3204577 1 1 0 1 1 2 2 4
6: -0.5941640 0 4 1 0 0 2 3 1
7: -1.8852835 1 4 1 0 0 2 1 1
8: -0.8329852 0 2 0 0 1 1 1 2
9: -0.1353628 0 4 0 1 1 1 4 1
10: -0.2943969 1 4 0 1 0 4 3 3
> lapply(DT, class)
$X
[1] "numeric"
$BIN
[1] "integer"
$CAT
[1] "factor"
$CAT1
[1] "integer"
$CAT2
[1] "integer"
$CAT3
[1] "integer"
$BIN1
[1] "factor"
$BIN2
[1] "factor"
$BIN3
[1] "factor"