首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据R中的另一列创建类别列

根据R中的另一列创建类别列
EN

Stack Overflow用户
提问于 2018-05-02 09:46:05
回答 2查看 1.2K关注 0票数 4

我有数据,每个观测站(行)都有一个唯一的id。根据id的第一个字母,观察结果可以分成两组。我想要一个列/变量来标识这个组。

下面的代码可以工作。但我的问题是,是否有一种更优雅的R-方式来做到这一点?

代码语言:javascript
复制
> df <- data.frame(id = c("C-1", "P-2", "P-3", "C-2"))
> df$tmp_id <- startsWith(as.character(df$id), "C-")
> df
   id tmp_id
1 C-1   TRUE
2 P-2  FALSE
3 P-3  FALSE
4 C-2   TRUE
> df$typ[df$tmp_id == TRUE] <- "C"
> df$typ[df$tmp_id == FALSE] <- "P"
> df$typ <- factor(df$typ, levels=c("C", "P"), labels=c("Cheese", "Pork"))
> df
   id tmp_id    typ
1 C-1   TRUE Cheese
2 P-2  FALSE   Pork
3 P-3  FALSE   Pork
4 C-2   TRUE Cheese
> df$tmp_id <- NULL
> df
   id    typ
1 C-1 Cheese
2 P-2   Pork
3 P-3   Pork
4 C-2 Cheese

我的问题的一个扩展是,如果我有两个以上的组,我将如何处理这种情况?例如CheesePorkCandyChocolate

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-02 10:05:53

一种简单的方法是创建一个命名向量,比如types,将其用作查找表,将前缀链接到组。然后,您可以从id列中提取前缀,并对查找向量进行索引以找到相应的组名:

代码语言:javascript
复制
df <- data.frame(id = c("C-1", "P-2", "P-3", "C-2"))

types <- c(C = "Cheese", P = "Pork")
df$typ <- types[substr(df$id, 1, 1)]

df
#>    id    typ
#> 1 C-1 Cheese
#> 2 P-2   Pork
#> 3 P-3   Pork
#> 4 C-2 Cheese

如果要添加其他组,只需向充当查找表的向量添加进一步的前缀组映射:

代码语言:javascript
复制
df <- data.frame(id = c("Ch-1", "Po-2", "Po-3", "Ca-2"))

types <- c(Ca = "Candy", Ch = "Cheese", Po = "Pork")
df$typ <- types[substr(df$id, 1, 2)]

df
#>     id    typ
#> 1 Ch-1 Cheese
#> 2 Po-2   Pork
#> 3 Po-3   Pork
#> 4 Ca-2  Candy

如果您想要允许不同长度的前缀,那么您可能需要查看从id列中提取它们的正则表达式。

reprex封装创建于2018-05-02 (v0.2.0)。

票数 2
EN

Stack Overflow用户

发布于 2018-05-02 10:03:28

dplyr包可以很好地处理这个问题。我认为如果一个flaggingflag变量/列,您所追求的是什么。这将告诉您哪些行满足某一特定条件,哪些行不满足。下面的代码将为开始在1列中有一个C的所有行生成一个编码为id的标志。type列只是另一个标志,可以用ifelse语句以相同的方式创建。

代码语言:javascript
复制
require(dplyr)

df <-  data.frame(id = c("C-1", "P-2", "P-3", "C-2")) # OP's dataset

df %>% 
  mutate(flag = ifelse(str_detect(id,'C'),1,0), # mutate adds columns
         type = ifelse(flag == 1,'Cheese','Pork')) 


# A tibble: 4 x 3
  id     flag type  
  <chr> <dbl> <chr> 
1 C- 1   1.00 Cheese
2 P- 2   0    Pork  
3 P- 3   0    Pork  
4 C- 4   1.00 Cheese
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50131595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档