3

愚蠢的例子df,“猫”:

species color tail_length
calico  brown     6
calico  gray      6
tabby   multi     5
tabby   brown     5

假设我想创建一个新变量,personality。此处的值将根据 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 初学者,我非常感谢您的帮助。

4

3 回答 3

1

这是使用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%充当哈希表查找。

于 2015-03-06T01:51:25.917 回答
0

这真的只是一个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
于 2015-03-06T04:38:40.143 回答
0

在这里您无能为力,因为归根结底,您仍然需要指定要分配的条件和新变量。

但是,您可以使用以下方法减少样板代码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"
})
于 2015-03-06T01:47:23.743 回答