R语言 从具有增量的连续变量创建组

lymnna71  于 2023-03-05  发布在  其他
关注(0)|答案(3)|浏览(151)

我在尝试用增量的连续变量来创建分类组。

score <- sample(1:100,20,replace=TRUE)
df <- data.frame(score)

我想在score列中基于增量20(不含)创建新的分类列。我还希望新分类列的名称也采用这种格式。

df <- df%>%
  mutate(G1_0_20 = case_when(score >= 0 & score <20 ~ 1),
         G2_20_40 = case_when(score >= 20 & score < 40 ~ 1),
         G3_40_60 = case_when(score >= 40 & score < 60 ~ 1),
         G4_60_80 = case_when(score >= 60 & score < 80 ~ 1),
         G5_80_100 = case_when(score >= 80 & score < 100 ~ 1))
df[is.na(df)] <- 0
df

我想知道是否有一种更简单、更快速的方法来为需要从值0到4000以20为增量创建组的数据集创建此函数。
另外,如果我想从值0到100递增20,然后从200到300递增100。
我会很感激所有的帮助!谢谢!

i5desfxk

i5desfxk1#

我们可以使用cut来创建分组,然后使用dummy_colsfastDummies创建虚拟列

library(stringr)
library(dplyr)
library(fastDummies)
df %>%
   mutate(grp = cut(score, breaks = c(-Inf, seq(0, 4000, by = 20), Inf)), 
      grp = str_c("G", as.integer(droplevels(grp)), '_', 
      str_replace(grp, '\\((\\d+),(\\d+)\\]', 
     '\\1_\\2'))) %>% 
   dummy_cols("grp", remove_selected_columns = TRUE) %>% 
   rename_with(~ str_remove(.x, 'grp_'), starts_with('grp_'))
  • 输出
score G1_0_20 G2_20_40 G3_40_60 G4_60_80 G5_80_100
1     20       1        0        0        0         0
2     99       0        0        0        0         1
3     44       0        0        1        0         0
4     28       0        1        0        0         0
5     63       0        0        0        1         0
6     88       0        0        0        0         1
7     44       0        0        1        0         0
8     59       0        0        1        0         0
9    100       0        0        0        0         1
10    55       0        0        1        0         0
11    37       0        1        0        0         0
12    54       0        0        1        0         0
13     6       1        0        0        0         0
14     7       1        0        0        0         0
15    48       0        0        1        0         0
16    88       0        0        0        0         1
17    97       0        0        0        0         1
18    10       1        0        0        0         0
19    65       0        0        0        1         0
20    18       1        0        0        0         0
vwkv1x7d

vwkv1x7d2#

为此,我们可以使用dplyover::over()并创建一个序列,以便使用seq()循环。免责声明:软件包不在CRAN上,我是维护者。
.names参数允许我们动态地创建漂亮的名字,我们可以使用{x_idx}来访问索引元素的编号,使用{x}来访问迭代的值。
下面的例子显示了一个从20100的序列,但是我们可以通过替换数字来生成任何序列。

set.seed(123)
score <- sample(1:100,20,replace=TRUE)
df <- data.frame(score)

library(dplyr)
library(dplyover) # https://timteafan.github.io/dplyover/

df %>% 
  mutate(over(seq(20, 100, 20),
              ~ if_else(score < .x & score > (.x - 20), 1, 0),
              .names = "G{x_idx}_{x - 20}_{x}"
  ))
#>    score G1_0_20 G2_20_40 G3_40_60 G4_60_80 G5_80_100
#> 1     31       0        1        0        0         0
#> 2     79       0        0        0        1         0
#> 3     51       0        0        1        0         0
#> 4     14       1        0        0        0         0
#> 5     67       0        0        0        1         0
#> 6     42       0        0        1        0         0
#> 7     50       0        0        1        0         0
#> 8     43       0        0        1        0         0
#> 9     14       1        0        0        0         0
#> 10    25       0        1        0        0         0
#> 11    90       0        0        0        0         1
#> 12    91       0        0        0        0         1
#> 13    69       0        0        0        1         0
#> 14    91       0        0        0        0         1
#> 15    57       0        0        1        0         0
#> 16    92       0        0        0        0         1
#> 17     9       1        0        0        0         0
#> 18    93       0        0        0        0         1
#> 19    99       0        0        0        0         1
#> 20    72       0        0        0        1         0

reprex package(v2.0.1)于2023年2月27日创建

ilmyapht

ilmyapht3#

碱基R:

a <- cut(df$score, seq(0,4000, 20))
G <- paste0(as.integer(a), sub("\\((\\d+),(\\d+)\\]", "_\\1_\\2",a))
data.frame(score = df$score, model.matrix(~G+0))

  score G1_0_20 G2_20_40 G3_40_60 G4_60_80 G5_80_100
1     31       0        1        0        0         0
2     79       0        0        0        1         0
3     51       0        0        1        0         0
4     14       1        0        0        0         0
5     67       0        0        0        1         0
6     42       0        0        1        0         0
7     50       0        0        1        0         0
8     43       0        0        1        0         0
9     14       1        0        0        0         0
10    25       0        1        0        0         0
11    90       0        0        0        0         1
12    91       0        0        0        0         1
13    69       0        0        0        1         0
14    91       0        0        0        0         1
15    57       0        0        1        0         0
16    92       0        0        0        0         1
17     9       1        0        0        0         0
18    93       0        0        0        0         1
19    99       0        0        0        0         1
20    72       0        0        0        1         0

相关问题