我有一列,它是每个家庭的收入,我想使用一个指标以便在分析中使用它。如果收入大于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), )
答案 0 :(得分:1)
一种基本的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值。
答案 1 :(得分:0)
我们可以使用gsubfn
来获取二进制格式。我们从“ INCOM”中删除带有$,
的{{1}},捕获gsub
中的数字,将其转换为gsubfn
,与35000进行比较并提取二进制数字
numeric
或带有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