簡體   English   中英

如何使用指標變量或虛擬變量作為因子變量?

[英]how I can use indicator or dummy variable for a factor variable?

我有一列是每個家庭的收入,我想使用一個指標以便在分析中使用它。 如果收入大於35000 $,我希望它為1,否則為0。

  Household          INCOM
      1         (5) $50,000 - $74,999
      2         (3) $25,000 - $34,99
      3         (4) $35,000 - $49,999

所以指標變量必須是

     IND
      1
      0
      1

我使用了以下內容,但是由於INCOM不是數字,所以它當然不起作用:

     df %>% mutate(`income` = 1* (INCOM >= 35000), )       

一種基本的R方法可能是

df$Ind <- as.integer(sapply(strsplit(sub(".*\\$(\\d+).*\\$(\\d+).*", "\\1-\\2", 
           gsub(",", "", df$INCOM)), "-"), function(x) any(as.numeric(x) > 35000)))

df
#  Household                 INCOM Ind
#1         1 (5) $50,000 - $74,999   1
#2         2  (3) $25,000 - $34,99   0
#3         3 (4) $35,000 - $49,999   1

我試圖一口氣做所有事情,讓我一一解釋所有命令

使用gsub我們刪除INCOM存在的所有逗號

gsub(",", "", df$INCOM)
#[1] "(5) $50000 - $74999" "(3) $25000 - $3499"  "(4) $35000 - $49999"

然后使用sub提取$之后的兩個數字

sub(".*\\$(\\d+).*\\$(\\d+).*", "\\1-\\2", gsub(",", "", df$INCOM))
#[1] "50000-74999" "25000-3499"  "35000-49999"

然后,我們將字符串分割為-

strsplit(sub(".*\\$(\\d+).*\\$(\\d+).*", "\\1-\\2", gsub(",", "", df$INCOM)), "-")

#[[1]]
#[1] "50000" "74999"

#[[2]]
#[1] "25000" "3499" 

#[[3]]
#[1] "35000" "49999"

然后使用sapply將這些數字轉換為數字,並檢查數字中的任何一個是否大於35000,並相應地提供1/0值。

我們可以使用gsubfn來獲取二進制格式。 我們從“ INCOM”中刪除帶有gsub$,捕獲gsubfn的數字,將其轉換為numeric ,與35000進行比較並提取二進制數字

library(gsubfn)
df1$ind <- as.integer(sub(".* ", "", gsubfn("(\\d+) - (\\d+)",
    ~ +(any(as.numeric(c(x, y))  > 35000)), gsub("[$,]", "", df1$INCOM))))
 df1$ind
#[1] 1 0 1

或帶有tidyverse的選項

library(tidyverse)
library(readr)
df1 %>% 
  extract(INCOM, into = c("col1", "col2"), remove = FALSE, 
    ".*\\$(\\d+,\\d+) - \\$(\\d+,\\d+)") %>% 
  mutate_at(vars(starts_with('col')), parse_number) %>%
  mutate(Ind = as.integer(col1 > 35000 | col2 > 35000)) %>% 
  select(-col1, -col2)
#   Household                 INCOM Ind
#1         1 (5) $50,000 - $74,999   1
#2         2  (3) $25,000 - $34,99   0
#3         3 (4) $35,000 - $49,999   1

或另一個選擇是

str_remove_all(df1$INCOM, ",") %>%
      str_extract_all("(?<=[$])([0-9]+)") %>%
      map_int(~ +(any(as.numeric(.x) > 35000)))
#[1] 1 0 1

數據

df1 <- structure(list(Household = 1:3, INCOM = c("(5) $50,000 - $74,999", 
"(3) $25,000 - $34,99", "(4) $35,000 - $49,999")), class = "data.frame",
row.names = c(NA, 
-3L))

暫無
暫無

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

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