如何在 R 中的 cut 函数中放置多个中断?
How to put multiple breaks in cut function in R?
我有 3 列我想根据每个列的 3 个不同的中断来放置标签,就像示例中一样,但我不知道如何,因为我可以为相同的中断标记多个列,但不能为不同的中断标记( br1, br2, br3).
var <- 1:10
x1 <- rnorm(10, mean=100, sd=25)
x2 <- rnorm(10, mean=100, sd=25)
x3 <- rnorm(10, mean=100, sd=25)
df <- data.frame(var,x1,x2,x3)
#With 1 break for all the columns
br1 <-c(50,60,70,80,90,100,110,120,130,140)
df2 <-data.frame(lapply(df[, 2:4], cut, br=br1, labels=c(1:9)))
问题:如何在相同的代码或任何想法中对列 x2 和 x3 使用以下中断(#breaks 2 和 3),以便每个列(x1、x2、x3)都有一个中断(br1、 br2, br3)?
#breaks 2 and 3
br2 <-c(30,40,45,55,61,70,98,105,115,138)
br3<-c(20,25,30,35,38,42,45,70,95,132)
您可以使用 Map
:
Map(function(x, y, labels=1:9) cut(x, y, labels = labels), df[, 2:4], list(br1, br2, br3))
输出是 df
列的列表。可以使用 as.data.frame
将其转换为数据框。您还可以将其他参数添加到 cut
(例如,include_lowest
)。提供的间隔之外的值是 NA
s.
# OUTPUT
$x1
[1] 6 8 <NA> 8 9 4 5 <NA> 6 8
Levels: 1 2 3 4 5 6 7 8 9
$x2
[1] 8 6 6 5 3 7 8 6 9 8
Levels: 1 2 3 4 5 6 7 8 9
$x3
[1] 8 9 <NA> 9 9 9 <NA> 9 8 8
Levels: 1 2 3 4 5 6 7 8 9
数据
set.seed(123)
var <- 1:10
x1 <- rnorm(10, mean=100, sd=25)
x2 <- rnorm(10, mean=100, sd=25)
x3 <- rnorm(10, mean=100, sd=25)
df <- data.frame(var,x1,x2,x3)
#With 1 break for all the columns
br1 <-c(50,60,70,80,90,100,110,120,130,140)
br2 <-c(30,40,45,55,61,70,98,105,115,138)
br3<-c(20,25,30,35,38,42,45,70,95,132)
考虑使用 for
循环将 cut
值分配为新列,使用 get()
在列后缀中使用变量名称:
set.seed(1082019)
#...
for(b in c("br1", "br2", "br3"))
df[paste0(names(df)[2:4], "_", b)] <- lapply(df[, 2:4], cut, br=get(b), labels=c(1:9))
df
# var x1 x2 x3 x1_br1 x2_br1 x3_br1 x1_br2 x2_br2 x3_br2 x1_br3 x2_br3 x3_br3
# 1 1 121.95508 98.40327 139.31413 8 5 9 9 7 <NA> 9 9 <NA>
# 2 2 105.28775 116.99844 83.12366 6 7 4 8 9 6 9 9 8
# 3 3 80.17226 118.92694 104.57693 4 7 6 6 9 7 8 9 9
# 4 4 146.94335 90.50056 58.35752 <NA> 5 1 <NA> 6 4 <NA> 8 7
# 5 5 98.15953 23.58072 86.67441 5 <NA> 4 7 <NA> 6 9 1 8
# 6 6 137.52613 74.83507 95.49531 9 3 5 9 6 6 <NA> 8 9
# 7 7 51.41213 141.01571 68.36462 1 <NA> 2 3 <NA> 5 7 <NA> 7
# 8 8 74.05926 134.66125 93.40060 3 9 5 6 9 6 8 <NA> 8
# 9 9 63.16221 52.25081 76.96090 2 1 3 5 3 6 7 7 8
# 10 10 123.96491 73.03856 138.41414 8 3 9 9 6 <NA> 9 8 <NA>
我有 3 列我想根据每个列的 3 个不同的中断来放置标签,就像示例中一样,但我不知道如何,因为我可以为相同的中断标记多个列,但不能为不同的中断标记( br1, br2, br3).
var <- 1:10
x1 <- rnorm(10, mean=100, sd=25)
x2 <- rnorm(10, mean=100, sd=25)
x3 <- rnorm(10, mean=100, sd=25)
df <- data.frame(var,x1,x2,x3)
#With 1 break for all the columns
br1 <-c(50,60,70,80,90,100,110,120,130,140)
df2 <-data.frame(lapply(df[, 2:4], cut, br=br1, labels=c(1:9)))
问题:如何在相同的代码或任何想法中对列 x2 和 x3 使用以下中断(#breaks 2 和 3),以便每个列(x1、x2、x3)都有一个中断(br1、 br2, br3)?
#breaks 2 and 3
br2 <-c(30,40,45,55,61,70,98,105,115,138)
br3<-c(20,25,30,35,38,42,45,70,95,132)
您可以使用 Map
:
Map(function(x, y, labels=1:9) cut(x, y, labels = labels), df[, 2:4], list(br1, br2, br3))
输出是 df
列的列表。可以使用 as.data.frame
将其转换为数据框。您还可以将其他参数添加到 cut
(例如,include_lowest
)。提供的间隔之外的值是 NA
s.
# OUTPUT
$x1
[1] 6 8 <NA> 8 9 4 5 <NA> 6 8
Levels: 1 2 3 4 5 6 7 8 9
$x2
[1] 8 6 6 5 3 7 8 6 9 8
Levels: 1 2 3 4 5 6 7 8 9
$x3
[1] 8 9 <NA> 9 9 9 <NA> 9 8 8
Levels: 1 2 3 4 5 6 7 8 9
数据
set.seed(123)
var <- 1:10
x1 <- rnorm(10, mean=100, sd=25)
x2 <- rnorm(10, mean=100, sd=25)
x3 <- rnorm(10, mean=100, sd=25)
df <- data.frame(var,x1,x2,x3)
#With 1 break for all the columns
br1 <-c(50,60,70,80,90,100,110,120,130,140)
br2 <-c(30,40,45,55,61,70,98,105,115,138)
br3<-c(20,25,30,35,38,42,45,70,95,132)
考虑使用 for
循环将 cut
值分配为新列,使用 get()
在列后缀中使用变量名称:
set.seed(1082019)
#...
for(b in c("br1", "br2", "br3"))
df[paste0(names(df)[2:4], "_", b)] <- lapply(df[, 2:4], cut, br=get(b), labels=c(1:9))
df
# var x1 x2 x3 x1_br1 x2_br1 x3_br1 x1_br2 x2_br2 x3_br2 x1_br3 x2_br3 x3_br3
# 1 1 121.95508 98.40327 139.31413 8 5 9 9 7 <NA> 9 9 <NA>
# 2 2 105.28775 116.99844 83.12366 6 7 4 8 9 6 9 9 8
# 3 3 80.17226 118.92694 104.57693 4 7 6 6 9 7 8 9 9
# 4 4 146.94335 90.50056 58.35752 <NA> 5 1 <NA> 6 4 <NA> 8 7
# 5 5 98.15953 23.58072 86.67441 5 <NA> 4 7 <NA> 6 9 1 8
# 6 6 137.52613 74.83507 95.49531 9 3 5 9 6 6 <NA> 8 9
# 7 7 51.41213 141.01571 68.36462 1 <NA> 2 3 <NA> 5 7 <NA> 7
# 8 8 74.05926 134.66125 93.40060 3 9 5 6 9 6 8 <NA> 8
# 9 9 63.16221 52.25081 76.96090 2 1 3 5 3 6 7 7 8
# 10 10 123.96491 73.03856 138.41414 8 3 9 9 6 <NA> 9 8 <NA>