簡體   English   中英

在 R 中將虛擬變量隱藏為單個分類?

[英]Covert dummy variables to single categorical in R?

這里這里這里都提出了類似的問題。 但是,它們似乎並不能完全滿足我的需要。 例如,如果我有這樣的數據集:

df <- data.frame(
  x = rnorm(10),
  y = rnorm(10),
  a = c(0,0,0,1,1,0,0,0,1,0),
  b = c(1,1,1,1,0,0,1,0,0,0),
  c = c(0,1,0,1,0,0,0,0,0,0),
  z = c(1,1,1,1,1,0,1,0,1,0)
)

我想要做的是將變量abc轉換為水平為abc的單個分類。 但正如您所見,有時 2 個變量會出現在同一行中。 所以,我想要實現的是一個看起來像這樣的數據框:

df <- data.frame(
  x = rnorm(10),
  y = rnorm(10),
  a = c(0,0,0,1,1,0,0,0,1,0),
  b = c(1,1,1,1,0,0,1,0,0,0),
  c = c(0,1,0,1,0,0,0,0,0,0),
  z = c(“b”,“b,c”,“b”,“a,b,c”,“a”,0,“b”,0,“a”,0)
)

我嘗試使用:

apply(df[,c("a","b", "c")], 1, sum, na.rm=TRUE)

它總結了每個變量的數量......但我不確定如何將 2 個(或更多)變量組合成一個單一的因素水平?

關於我如何做到這一點的任何建議?

逐行遍歷所選列( MARGIN = 1 ),將值為 1 的列名子集並將它們paste在一起

df$z <-  apply(df[c('a', 'b', 'c')], 1, function(x) toString(names(x)[x ==1]))
df$z
#[1] "b"       "b, c"    "b"       "a, b, c" "a"       ""        "b"       ""        "a"       ""       

如果我們想把""改成“0”

df$z[df$z == ''] <- '0'

對於具有 purrr 和 dplyr 的解決方案:

df %>% mutate(z = pmap_chr(select(., a, b, c), ~  {v1 <- c(...); toString(names(v1)[v1 == 1])}))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM