r - 根据数字的长度和数字的部分将数据分类
问题描述
我有以下数据框。
用户 | 标识 |
---|---|
用户 1 | 45668 |
用户 2 | 68445 |
用户 3 | 75006 |
用户 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”。
用户 | 标识 | Ident_Cat |
---|---|---|
用户 1 | 45668 | 猫 A |
用户 2 | 68445 | 猫 A |
用户 3 | 75006 | 猫 B |
用户 4 | 8000 | Cat_Unknown |
我可以用:
c <- df %>%
+ filter(substr(df2$Ident, 1,2) == 45)
c$Ident_Cat<-"CatA"
和rbind
但这似乎是一个讨厌的解决方法。
有任何想法吗。谢谢
解决方案
所以像这样:
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))
发出警告,但这不是错误
推荐阅读
- java - 调用 REST 端点时发生错误。[[java.net.SocketTimeoutException:读取超时]]。500 内部服务器错误
- python - 在 while 循环条件下使用 len() 函数效率低吗?
- algorithm - 反转计数算法混乱
- python - Flake8 禁用所有格式化规则
- python - 将熊猫数据帧写入到_pickle时如何修复“TypeError:无法序列化'_io.BufferedReader'对象”?
- android - 无法获取未知属性“localProperties”
- javascript - 反应中 ({}) 的含义是什么?
- .net - 尝试在 .NET 中创建任务列表时,我们是否需要包含 async / await 语法?
- informatica - Informatica infacmd.sh 在 Linux 上消耗高 CPU 和平均负载
- android - 如何通过单击工具栏图标Android导航到片段