我试图在R中创建一个随机数据集,它有度量,二项式和分类变量。然而,当我检查我的分类变量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是一个因素,所以当我在函数中使用它时,我不明白为什么它不这样做,而且loop...any帮助是非常精确的,谢谢!
发布于 2017-03-12 15:03:59
您不需要循环,如果切换到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"发布于 2017-03-12 14:47:12
当你这样做时:
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)
}发布于 2017-03-12 14:46:40
由于矩阵不接受因子向量,因此它将被强迫为数。只需将其转换为dataframe:
CAT <- matrix(0,n,cat)
CAT <- as.data.frame(CAT)这就行了。
https://stackoverflow.com/questions/42748648
复制相似问题