按组突变不同的切点

时间:2019-11-22 15:18:19

标签: list dplyr purrr cut

我想为不同的组剪切具有不同切点的数字变量。

我尝试合并到一个列表中,但是我怀疑我需要某种功能和循环的组合。可以在[此处] [1]找到类似的重新编码示例,但是cut将不接受列表。

有什么建议吗?

可以扩展为宽格式,但是我想知道如何以长格式进行。

```Cutpoints2<-c(0,10,20,50,100,9999)
```Cutpoints1<-c(0,1,10,100,9999)
```Cutpoints<-list(Cutpoints1, Cutpoints2) 
```Df2<-Df1 %>%
```group_by(group) %>%
```mutate(varcat=cut(var,Cutpoints)) 


  [1]: http://Www.stackoverflow.com/questions/56636417

1 个答案:

答案 0 :(得分:0)

如果您指的是基数R cut(在上下文中很有意义),则可以使用几种不同的方法,具体取决于组变量的编码方式以及要执行的键入与转换量。 (如果您没有向我们展示您的数据,那么很难说出最好的方法。)

library(tidyverse)

Cutpoints2<-c(0,10,20,50,100,9999)
Cutpoints1<-c(0,1,10,100,9999)

test = tibble(
  numbers = seq(from = 0, 99.5, by = 0.5),
  group = rep(c(1,2),length(numbers)/2)
) 
## Method 1: ifelse
test %>% 
  group_by(group) %>% 
  mutate(cut_group = 
    ifelse(group == 1, 
           cut(numbers, Cutpoints1) %>% as.character,
           cut(numbers, Cutpoints2) %>% as.character)
  )
## Method 2: get
test %>% 
  group_by(group) %>% 
  mutate(cut_group = 
            cut(numbers,
                get(paste0("Cutpoints",group))) %>% as.character
  )

如果只有几个切点,那么ifelse方法是调用cut的简单方法,它使用对每个切点矢量的手动引用来注释行。您必须致电as.character,因为剪切产生的因素不能很好地发挥作用。 (也许在函数中也可以摆脱它,但是as.character在任何情况下都可以使用。)但是,如果您有很多切点,则可以使用get来实现。抓取作为字符串传递的变量的值,这是我在这里用paste0构造的-如果将它们编码为“ group1”或其他内容,则可以stringr::str_replace_all

无论哪种情况,您都可以使用我创建的测试提示得到此结果:

# A tibble: 200 x 3
# Groups:   group [2]
   numbers group cut_group
     <dbl> <dbl> <chr>    
 1     0       1 NA       
 2     0.5     2 (0,10]   
 3     1       1 (0,1]    
 4     1.5     2 (0,10]   
 5     2       1 (1,10]   
 6     2.5     2 (0,10]   
 7     3       1 (1,10]   
 8     3.5     2 (0,10]   
 9     4       1 (1,10]   
10     4.5     2 (0,10]   
# … with 190 more rows

如果矢量列表中已经包含所有切点,则只需使用Cutpoints[[paste0("Cutpoints",group)]]调用它们,而不使用get。否则,没有必要将它们包装在列表中。