【问题标题】:Sorting data into categories based on length of a number and parts of the number根据数字的长度和数字的部分将数据分类
【发布时间】:2021-06-03 21:43:09
【问题描述】:

我有以下数据框。

User Ident
User 1 45668
User 2 68445
User 3 75006
User 4 8000
User<- c("User1","User2","User3","User4")
Ident <- c(45668,68445,75006,8000)
df<-data.frame("User"=User,"Ident"=Ident)

我现在想要第三列,创建条件如下:

  • 如果号码有四位数 => 类别“Cat_Unknown”
  • 如果号码有五位数,则根据前两位数将它们归入一个类别。例如
  • 45*** == 猫 A
  • 68*** == 猫 A
  • 75*** == 猫 B

根据评论添加信息:我将 => 更改为 ==。它不是一个范围。每两位数字都可以有一个单独的“Ident_Cat”。

User Ident Ident_Cat
User 1 45668 Cat A
User 2 68445 Cat A
User 3 75006 Cat B
User 4 8000 Cat_Unknown

我可以使用:

c <- df %>% 
  +     filter(substr(df2$Ident, 1,2) == 45)
c$Ident_Cat<-"CatA"

rbind

但这似乎是一个令人讨厌的解决方法。

任何想法。 谢谢

【问题讨论】:

  • 使用 mutate 创建一个使用 floor(ident/1000) 的新列,它将给出 45、65、75、8 作为值。然后用forcats来应用类别?不清楚 10-74 是否是猫 A,>74 猫 B,

标签: r dataframe sorting dplyr


【解决方案1】:

像这样:


library(forcats)
library(dplyr)

User<- c("User1","User2","User3","User4")
Ident <- c(45668,68445,75006,8000)
df<-data.frame("User"=User,"Ident"=Ident)

df %>%
mutate(cat = as_factor(floor(Ident/1000)))%>%
mutate(cat =fct_collapse( cat,
Unknown ="8",
A = c("45","68"),
B = "75"))

或者更具可扩展性?

library(forcats)
library(dplyr)

User<- c("User1","User2","User3","User4")
Ident <- c(45668,68445,75006,8000)
df<-data.frame("User"=User,"Ident"=Ident)

U <- as.character(c(0:9))
A <- as.character(c(10:69))
B <-as.character(c(70:99))

df %>%
mutate(cat = as_factor(floor(Ident/1000)))%>%
mutate(cat =fct_collapse( cat,
Unknown = U,
A = A,
B = B))

发出警告,但不是错误

【讨论】:

    猜你喜欢
    • 2020-06-21
    • 2023-01-18
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多