我有数据,每个观测站(行)都有一个唯一的id。根据id的第一个字母,观察结果可以分成两组。我想要一个列/变量来标识这个组。
下面的代码可以工作。但我的问题是,是否有一种更优雅的R-方式来做到这一点?
> 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,Chocolate
发布于 2018-05-02 10:05:53
一种简单的方法是创建一个命名向量,比如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封装创建于2018-05-02 (v0.2.0)。
发布于 2018-05-02 10:03:28
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 Cheesehttps://stackoverflow.com/questions/50131595
复制相似问题