[英]What is the simplest way to recode a variable based on conditions of another variable in R?
愚蠢的例子df,“猫”:
species color tail_length
calico brown 6
calico gray 6
tabby multi 5
tabby brown 5
假设我想创建一个新的变量,个性。 这里的值将根据tail_length进行重新编码,但也取决于猫的种类和颜色。 所以理想的最终df看起来像这样:
species color tail_length personality
calico brown 6 mean
calico gray 6 nice
tabby multi 5 mean
tabby brown 5 nice
目前,我正在使用代码:
library(car)
cat$personality<-recode(cat$tail_length, "'6'==mean, '5'==nice")
cat$personality[cat$species=="calico" & cat$color=="brown"] <- mean
cat$personality[cat$species=="calico" & cat$color=="gray"] <- nice
cat$personality[cat$species=="tabby" & cat$color=="multi"]<- mean
cat$personality[cat$species=="tabby" & cat$color=="brown"]<-nice
我的主要问题是:是否有更简单的方法将这些功能合并为一个? 鉴于我在飞行中编写了这个示例数据,请在回答时带上一点点盐。 谢谢! 作为R初学者,我非常感谢你的帮助。
这是使用qdap和qdapTools (我维护的CRAN包)的一种方法:
library(qdap); library(qdapTools)
key <- list(
mean = c( "calico.gray", "tabby.brown"),
nice = c("calico.brown", "tabby.multi")
)
dat[["personality"]] <- paste2(dat[1:2]) %l% key
dat
## species color tail_length personality
## 1 calico brown 6 nice
## 2 calico gray 6 mean
## 3 tabby multi 5 nice
## 4 tabby brown 5 mean
基本上,您创建一个基于组合列的命名列表的键。 然后%l%
充当哈希表查找。
你在这里做的并不多,因为在一天结束时,你仍然需要指定要分配的条件和新变量。
但是,您可以通过减少对样板代码within
:
within(cat, {
personality <- recode(tail_length, "'6'==mean, '5'==nice")
personality[species == "calico" & color == "brown"] <- "mean"
personality[species=="calico" & color=="gray"] <- "nice"
personality[species=="tabby" & color=="multi"] <- "mean"
personality[species=="tabby" & color=="brown"] <- "nice"
})
这实际上只是一个merge
操作。 (此外,你已经指定了标准,因为species
和tail_length
是完全相关的。但是因为它只是一个可能不是问题的例子。)假设你的第一个数据帧是dat
,标准数据帧是lookup
。 那么你需要做的就是:
> merge(dat, lookup)
species color tail_length personality
1 calico brown 6 mean
2 calico gray 6 nice
3 tabby brown 5 nice
4 tabby multi 5 mean
不是一个非常有趣或戏剧性的结果,因为它看起来就像lookup
数据帧,但给它一些更大的东西:
> merge( rbind(dat,dat,dat) , lookup)
species color tail_length personality
1 calico brown 6 mean
2 calico brown 6 mean
3 calico brown 6 mean
4 calico gray 6 nice
5 calico gray 6 nice
6 calico gray 6 nice
7 tabby brown 5 nice
8 tabby brown 5 nice
9 tabby brown 5 nice
10 tabby multi 5 mean
11 tabby multi 5 mean
12 tabby multi 5 mean
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.