我有数据,其中每个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
,Cheese
,Pork
,Candy
答案 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
包可以雄辩地处理这个问题。如果有flagging
或flag
变量/列,我想您的目标是什么。这将告诉您哪些行符合某个条件而哪些行不符合。以下代码将为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