因式分解变量

Factorizing a variable

提问人:MetabO 提问时间:7/23/2023 最后编辑:MarkMetabO 更新时间:7/24/2023 访问量:42

问:

我正在尝试对一个变量进行因式分解,该变量基本上是一个人吃了多少种食物的计数。我的代码出现错误,我不确定如何解决此问题。

总数与食物计数是连续变量

Foods$count_quintile <- factor(Foods$Totals, levels = 1:5,
                                      labels = c("Q1", "Q2", "Q3", "Q4", "Q5"))

在我运行这个之后,count_quintile仍然是空的。

思潮?

r 分类 分解

评论

0赞 Jan 7/23/2023
如何创建一个最小的、可重现的示例
0赞 Mark 7/24/2023
嗨,MetabO,您可以运行并将结果添加到您的问题中吗?dput(Foods)

答:

0赞 Mark 7/24/2023 #1
简短的回答:

您需要对 Totals 列数据进行舍入,以便它适合您尝试创建的因子变量的 bin。

更长的答案:

在您的问题中,您说“总计与食物计数是连续变量”。创建连续的示例数据:

set.seed(0)

Foods <- data.frame(
    Totals = rnorm(7, 2.5, 1)
)

    Totals
1 3.762954
2 2.173767
3 3.829799
4 3.772429
5 2.914641
6 0.960050
7 1.571433

正如你所看到的,每个值都是介于 0 和 5 之间的分数,每个数字都有如此多的小数位,以至于它们中的任何一个都不太可能完全是整数。

在 中,该部分是说输入数据用数字 1 到 5 编码;第一类是,第二类是,第三类,以此类推。factor(Foods$Totals, levels = 1:5, labels = c("Q1", "Q2", "Q3", "Q4", "Q5"))levels = 1:5123

因此,当它查看我们在上面看到的 Total 列数据时,它没有看到任何这些值,它会返回 NA。然后重复,创建一列 NA。

为了让它起作用,(假设四舍五入 Total 适合您的数据!)您可以四舍五入到最接近的值,然后代码将起作用:

Foods$count_quintile <- factor(round(Foods$Totals), levels = 1:5, labels = c("Q1", "Q2", "Q3", "Q4", "Q5"))

    Totals count_quintile
1 3.762954             Q4
2 2.173767             Q2
3 3.829799             Q4
4 3.772429             Q4
5 2.914641             Q3
6 0.960050             Q1
7 1.571433             Q2
0赞 jay.sf 7/24/2023 #2

factor不是很合适的功能。显然,您正在寻找可以使用或任何方式指定五分位数的 .cut()quantile()breaks=

Foods <- transform(Foods,
                   count_quintile=cut(Totals, 
                                      breaks=quantile(Totals, seq.int(0, 1, length.out=6)), 
                                      include.lowest=TRUE,
                                      labels=paste0('Q', 1:5)))

str(Foods$count_quintile)
# Factor w/ 5 levels "Q1","Q2","Q3",..: 5 3 4 3 1 1 5 5 3 1 ...

head(Foods)
#          foo Totals       bar count_quintile
# 1  1.3709584     17 0.5131505             Q5
# 2 -0.5646982     11 0.4687138             Q3
# 3  0.3631284     13 0.4058770             Q4
# 4  0.6328626     11 0.7304523             Q3
# 5  0.4042683      6 0.6039375             Q1
# 6 -0.1061245      6 0.8713164             Q1

我们可以做一个交叉检查:

with(Foods, tapply(Totals, count_quintile, max))
# Q1 Q2 Q3 Q4 Q5 
#  7  9 11 13 21 

with(Foods, quantile(Totals, seq.int(0, 1, length.out=6)))
# 0%  20%  40%  60%  80% 100% 
#  2    7    9   11   13   21 

数据:

Foods <- n <- 1000; set.seed(42); Foods <- data.frame(foo=rnorm(n), Totals=rpois(n, 10), bar=runif(n))