gpt4 book ai didi

R:从数值变量和自定义/开放式/单值区间创建分类变量

转载 作者:行者123 更新时间:2023-12-02 14:04:22 25 4
gpt4 key购买 nike

我经常发现自己尝试从数值变量+用户提供的一组范围创建分类变量。

例如,假设我有一个带有数值变量 df$V 的 data.frame并想创建一个新变量 df$VCAT这样:

  • df$VCAT = 0 如果 df$V等于0
  • df$VCAT = 1 如果 df$V介于 0 到 10 之间(即 (0,10))
  • df$VCAT = 2 是 df$V等于 10(即 [10,10])
  • df$VCAT = 3 是 df$V介于 10 到 20 之间(即 (10,20))
  • df$VCAT = 4 是 df$V大于或等于 20(即 [20,Inf])

我目前正在通过自己硬编码“评分函数”来做到这一点,方法如下:

df = data.frame(V = seq(1,100))
df = df %>% mutate(VCAT = (V>0) + (V==10) + 2*(V>10) + (V>=20))

我想知道在 R 中是否有更简单的 hacky 方法来做到这一点,最好使用 dplyr (这样我就可以链接命令)。理想情况下,我正在寻找一个可以在 mutate 中使用的简短函数。它将接受变量 V以及描述范围的向量,例如 buckets 。请注意buckets此处可能无法以最佳方式进行描述,因为我不清楚它如何允许用户自定义范围的端点。

最佳答案

对数字进行分类的一种方法是使用模数运算符 %% 删除余数。 。例如。以 20 为一组进行分组:

#create raw data
unbinned<-c(1.1,1.53,5,8.3,33.5,49.22,55,57.9,79.6,81,95,201,213)
rawdata<-as.data.frame(unbinned)

#bin the data into groups of 20
binneddata<-mutate(rawdata,binned=unbinned-unbinned %% 20)

#print the data
binneddata

这会产生输出:

   unbinned binned
1 1.10 0
2 1.53 0
3 5.00 0
4 8.30 0
5 33.50 20
6 49.22 40
7 55.00 40
8 57.90 40
9 79.60 60
10 81.00 80
11 95.00 80
12 201.00 200
13 213.00 200

所以 0 代表 0-<20,20 代表 20-<40、40、40-<60 等(当然,将 binned 值除以 20 以获得像原始问题中那样的连续组)

奖金

如果您想将分箱值用作 ggplot 中的分类变量等等,通过将它们转换为字符串,它们的顺序会很奇怪,例如200 将位于 40 之前,因为字母表中“2”位于“4”之前,要解决此问题,请使用 sprintf函数创建前导零。 (3 中的 %03d 应该是您期望的最长数字的位数):

#convert the data into strings with leading zeros
binnedstring<-mutate(binneddata,bin_as_character=sprintf('%03d',binned))

#print the data
binnedstring

给出输出:

   unbinned binned bin_as_character
1 1.10 0 000
2 1.53 0 000
3 5.00 0 000
4 8.30 0 000
5 33.50 20 020
etc.

如果你想拥有000-<020 ,使用算术创建上限并使用粘贴函数连接:

#make human readable bin value
binnedstringband<-mutate(
binnedstring,
nextband=binned+20,
human_readable=paste(bin_as_character,'-<',sprintf('%03d',nextband),sep='')
)

#print the data
binnedstringband

给予:

   unbinned binned bin_as_character nextband     human_readable
1 1.10 0 000 20 000-<020
2 1.53 0 000 20 000-<020
3 5.00 0 000 20 000-<020
4 8.30 0 000 20 000-<020
5 33.50 20 020 40 020-<040
etc.

关于R:从数值变量和自定义/开放式/单值区间创建分类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35204157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com