我有一個包含年齡的資料框,我的目標是將這些年齡分組。
我找到了這樣做的方法,即cut從基礎 R使用。但是,我想更改輸出的格式。我在這篇文章中看到了一種方法,但正如有人所說,我丟失了原始符號中包含的資訊。
代碼:
set.seed(1234)
Age <- floor(runif(25, min=18, max=75))
df <- data.frame(Age)
mybreaks <- seq(min(df$Age)-1, to=max(df$Age) 10, by=10)
df$groups_age <- cut(df$Age, breaks = mybreaks, by=10)
label_interval <- function(breaks) {
paste0("(", breaks[1:length(breaks) - 1], "-", breaks[2:length(breaks)], ")")
}
df$groups_age_2 <- cut(df$Age, breaks = mybreaks, labels = label_interval(mybreaks))
df[7:12, ]
# Age groups_age groups_age_2
# 7 18 [17,27) (17-27)
# 8 31 [27,37) (27-37)
# 9 55 [47,57) (47-57)
# 10 47 [47,57) (37-47)
# 11 57 [57,67) (47-57)
# 12 49 [47,57) (47-57)
如您所見,列“group_age”是輸出,cut列“group_age2”是使用函式label_interval(有人在上一篇文章中寫過)的結果。
這可能是一個很好的解決方案,但我丟失了資訊。
例如,在第 7 行和第 8 行中,我們看到 2 個不同年齡組的不同年齡組。兩者都包含 27,這是不正確的。
我想要第 8 行,(28-37)但我不知道如何將它添加到函式中,以便對整個資料幀進行處理。
有誰知道怎么做?
uj5u.com熱心網友回復:
cut.bincode回傳組的整數格式的呼叫,其中 1 是最低的,然后是 2 等等。所以你可以手動進行格式化,然后將它們映射到集群索引,例如
format_groups <- sapply(1:(length(mybreaks)-1), function(i){
# to avoid adding 1 to the first cluster:
if(i>1){
b1 <- mybreaks[i] 1
}else{
b1 <- mybreaks[i]
}
sprintf("(%s-%s)", b1, mybreaks[i 1])
})
df$group_index <- .bincode(df$Age, breaks = mybreaks)
df$groups_age_2 <- format_groups[df$group_index]
uj5u.com熱心網友回復:
嘗試像這樣重新定義你的函式。它使用sprintf代替paste,在連接硬編碼和動態字串的情況下這可能更容易。
label_interval <- function(breaks) {
do.call(\(...) sprintf('(%s-%s)', ...),
cbind.data.frame(breaks[-length(breaks)] 1, breaks[-1]))
}
df$groups_age_2 <- cut(df$Age, breaks=mybreaks, labels=label_interval(mybreaks))
df[order(df$Age), ]
# Age groups_age groups_age_2
# 7 18 (17,27] (18-27)
# 24 20 (17,27] (18-27)
# 1 24 (17,27] (18-27)
# 23 27 (17,27] (18-27)
# 19 28 (27,37] (28-37)
# 25 30 (27,37] (28-37)
# 8 31 (27,37] (28-37)
# 20 31 (27,37] (28-37)
# 18 33 (27,37] (28-37)
# 13 34 (27,37] (28-37)
# 15 34 (27,37] (28-37)
# 17 34 (27,37] (28-37)
# 22 35 (27,37] (28-37)
# 21 36 (27,37] (28-37)
# 10 47 (37,47] (38-47)
# 12 49 (47,57] (48-57)
# 3 52 (47,57] (48-57)
# 2 53 (47,57] (48-57)
# 4 53 (47,57] (48-57)
# 6 54 (47,57] (48-57)
# 9 55 (47,57] (48-57)
# 11 57 (47,57] (48-57)
# 16 65 (57,67] (58-67)
# 5 67 (57,67] (58-67)
# 14 70 (67,77] (68-77)
資料:
df <- structure(list(Age = c(24, 53, 52, 53, 67, 54, 18, 31, 55, 47,
57, 49, 34, 70, 34, 65, 34, 33, 28, 31, 36, 35, 27, 20, 30),
groups_age = structure(c(1L, 4L, 4L, 4L, 5L, 4L, 1L, 2L,
4L, 3L, 4L, 4L, 2L, 6L, 2L, 5L, 2L, 2L, 2L, 2L, 2L, 2L, 1L,
1L, 2L), .Label = c("(17,27]", "(27,37]", "(37,47]", "(47,57]",
"(57,67]", "(67,77]"), class = "factor")), row.names = c(NA,
-25L), class = "data.frame")
mybreaks <- seq(min(df$Age) - 1, to=max(df$Age) 10, by=10)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388490.html
標籤:r
下一篇:在單詞和數字之間拆分字串
