簡體   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