[英]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.