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

时间:2018-05-02 09:46:05

标签: r

我有数据,其中每个oberservation(行)都有一个唯一的id。 根据{{​​1}}的第一个字母,观察结果可以分为两组。我想要一个列/变量来识别该组。

以下代码有效。但我的问题是,是否有更优雅的R方式来做到这一点?

id

我的问题的扩展是我如何处理这种情况,如果我有两个以上的群组?即G。 > 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 CheesePorkCandy

2 个答案:

答案 0 :(得分:2)

一个简单的方法是创建一个命名向量,比如types,用作 用于将前缀链接到组的查找表。然后你可以提取 来自id列的前缀并索引查找向量以查找 相应的组名:

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

如果您想添加其他群组,您只需要进一步添加 作为查找表的向量的前缀组映射:

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 package(v0.2.0)创建于2018-05-02。

答案 1 :(得分:1)

dplyr包可以雄辩地处理这个问题。如果有flaggingflag变量/列,我想您的目标是什么。这将告诉您哪些行符合某个条件而哪些行不符合。以下代码将为1列中包含C的所有行生成编码为id的标记。 type列只是另一个标志,可以使用ifelse语句以相同的方式创建。

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