繁体   English   中英

根据R中另一个变量的条件重新编码变量的最简单方法是什么?

[英]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初学者,我非常感谢你的帮助。

这是使用qdapqdapTools (我维护的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操作。 (此外,你已经指定了标准,因为speciestail_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM