首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类别变量显示为数字,而不是作为因素显示

类别变量显示为数字,而不是作为因素显示
EN

Stack Overflow用户
提问于 2017-03-12 14:33:29
回答 3查看 579关注 0票数 0

我试图在R中创建一个随机数据集,它有度量,二项式和分类变量。然而,当我检查我的分类变量R的类别时,R说它们是数字的,但我需要它们作为我进一步分析的因素。有人知道我在这里做错了什么吗?这是我的密码:

代码语言:javascript
复制
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)

如果我像这样取样:

代码语言:javascript
复制
x <- factor(sample(1:4, n, TRUE))
class(x)

它说x是一个因素,所以当我在函数中使用它时,我不明白为什么它不这样做,而且loop...any帮助是非常精确的,谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-12 15:03:59

您不需要循环,如果切换到data.table,可以通过引用生成它们。

代码语言:javascript
复制
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"
票数 0
EN

Stack Overflow用户

发布于 2017-03-12 14:47:12

当你这样做时:

代码语言:javascript
复制
  CAT <- matrix(0,n,cat)
  for (i in 1:cat) {
    CAT[,i] <- factor(sample(1:4, n, TRUE))
  }

创建一个数值矩阵CAT,然后将一个新值分配给该矩阵的子集。当您执行该赋值时,新值将被强制转换为CAT类型,该类型为数值。

此外,当您在最后cbind矩阵XBINCAT时,您强制将它们全部转换为一个公共类型。这将再次扰乱您的变量类型,即使假设到目前为止一切都正常工作。

您的其余代码也可以大大简化。特别是,不需要循环将值重新分配到矩阵;您可以直接在值向量上调用matrix构造函数。

试一试:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-03-12 14:46:40

由于矩阵不接受因子向量,因此它将被强迫为数。只需将其转换为dataframe:

代码语言:javascript
复制
CAT <- matrix(0,n,cat)
CAT <- as.data.frame(CAT)

这就行了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42748648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档