我有一些数据,每个观察值(行)都有一个唯一的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
types
...)很有趣!我从未见过这样的语法。为什么可以不用引号写Ca
?你有相关R文档基础部分的链接吗? - buhtzdf$typ
是character
而不是factor
。这里只需添加这一行代码df$typ <- factor(df$typ, levels=c("C", "P"), labels=c("Cheese", "Pork"))
或者有更加优雅的方式吗? ;) - buhtzc
中的命名问题,但如果你为其提供参数名称,它们将用于创建结果向量的名称。我似乎找不到这种行为的文档。关于获取一个“factor”,最简单的方法是使用as.factor
:df $ typ <- as.factor(types [substr(df $ id,1,1)])
。除非您希望因子级别按特定顺序排列,在这种情况下,像您建议的那样使用factor
会是可行的方式。 - Mikko Marttila