我想为不同的组剪切具有不同切点的数字变量。
我尝试合并到一个列表中,但是我怀疑我需要某种功能和循环的组合。可以在[此处] [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
答案 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
。否则,没有必要将它们包装在列表中。