R 如何使用指标变量或虚拟变量作为因子变量?

R 如何使用指标变量或虚拟变量作为因子变量?,r,dataframe,R,Dataframe,我有一列是每个家庭的收入,我想使用一个指标,以便在我的分析中使用它。如果收入大于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 我使用了

我有一列是每个家庭的收入,我想使用一个指标,以便在我的分析中使用它。如果收入大于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
然后使用sub提取后面的两个数字$

然后我们在-

然后使用sapply将这些数字转换为数字,并检查是否有任何数字大于35000,并相应地给出1/0值。

我们可以使用gsubfn获得二进制格式。我们从“INCOM”中删除$,使用gsub,捕获gsubfn中的数字,将其转换为数字,与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
或者另一种选择是

str_remove_all(df1$INCOM, ",") %>%
      str_extract_all("(?<=[$])([0-9]+)") %>%
      map_int(~ +(any(as.numeric(.x) > 35000)))
#[1] 1 0 1
数据
strsplit(sub(".*\\$(\\d+).*\\$(\\d+).*", "\\1-\\2", gsub(",", "", df$INCOM)), "-")

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

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

#[[3]]
#[1] "35000" "49999"
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
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))