R语言 分解一个变量

4smxwvx5  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(95)

我试图分解一个变量,这个变量基本上是一个人吃了多少食物种类的计数。我的代码是带出一个错误,我不知道如何解决这个问题。
总数随食物计数连续变化

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

字符串
在我运行这个之后,count_quintile仍然是空的。
有什么想法?

ergxz8rk

ergxz8rk1#

简答:

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

更长的答案:

在你的问题中,你说“总数随食物数量而连续变化”。创建连续样本数据:

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之间的某个分数,每个数字都有这么多的小数位,以至于它们中的任何一个都不太可能是整数 * 精确 *。
factor(Foods$Totals, levels = 1:5, labels = c("Q1", "Q2", "Q3", "Q4", "Q5"))中,levels = 1:5部分表示输入数据用数字1到5编码;第一类是1,第二类是2,第三类是3,等等。
因此,当它查看我们上面看到的Total列数据时,它没有看到任何这些值,它返回NA。然后重复,创建NA列。
要使其工作,(假设四舍五入总数是适合您的数据!)可以舍入到最近的值,然后代码就可以工作了:

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

flseospp

flseospp2#

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))

相关问题