分类变量显示为数字而不是因子

时间:2017-03-12 14:33:29

标签: r categorical-data

我试图在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是一个因素,所以当我在函数和循环中使用它时,我不知道它为什么不这样做...任何帮助都非常赞赏,提前感谢!

3 个答案:

答案 0 :(得分:1)

执行此操作时:

  CAT <- matrix(0,n,cat)
  for (i in 1:cat) {
    CAT[,i] <- factor(sample(1:4, n, TRUE))
  }

创建数值矩阵CAT,然后为该矩阵的子集分配新值。当您执行该分配时,新值强制CAT类型,这是数字。

此外,当您cbind矩阵XBINCAT结尾时,您将所有矩阵强制为共同类型。这会再次弄乱你的变量类型,即使假设到目前为止一切正常。

您的其余代码也可以大大简化。特别是,您不需要循环来将值重新分配给矩阵;您可以直接在值向量上调用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"