检查一个向量中的值是否小于另一个向量(具有不同长度)中的值,并用Y / N答案填充表格

时间:2018-06-20 21:51:43

标签: r dataframe vector

预先感谢您的帮助!

目标:我正在查看住房负担能力数据,构建了一个按职业显示住房负担能力的工具。我有一个职业及其中位数工资的数据框,以及该地区所有房地产的所有房屋价值的数据框。

挑战:我正在寻找一种方法,可以将每个房屋价值与针对每个职业的可负担性指标进行比较,并使用TRUE / FALSE,Y / N或如果原始值低于度量标准,则为1/0。最终结果将是带有原始值作为观察值的数据帧,并且每个职业都有一列。

这里有一些示例代码可以更好地说明问题:

我正在尝试将其组合:

Job          Median Wage  Can Afford
Lawyer       104756       272365.5
Bus Driver   26598        69154.8
Retail Sales 48923        127199.8

这:

Property Value
927346
12345
87492
12734
73642

要创建类似这样的内容:

Value   Lawyer   Bus Driver   Retail Sales
927346  N        N            N
12345   Y        N            Y
87492   Y        N            Y
12734   Y        Y            Y
73642   Y        Y            Y

运行Rstudio 3.5。任何想法将不胜感激!

2 个答案:

答案 0 :(得分:1)

我们可以使用map2中的purrr来执行此操作。遍历“作业”,“ MedianWage”的各个元素的行,检查第二个数据集中的“ PropertyValue”是否小于“ MedianWage”的2.6倍,以创建逻辑列并将数据集的list绑定到并与“ df2”的第一列结合在一起

library(tidyverse)
map2(df1$Job, df1$MedianWage, ~ 
                           df2 %>% 
                            transmute(!! .x :=  PropertyValue < 2.6 * .y)) %>% 
     bind_cols(df2, .)

或与pmap

pmap(df1, ~
       df2 %>% 
         transmute(!! ..1 := PropertyValue < 2.6 * ..2)) %>% 
  bind_cols(df2, .)
#   PropertyValue Lawyer Bus Driver Retail Sales
#1        927346  FALSE      FALSE        FALSE
#2         12345   TRUE       TRUE         TRUE
#3         87492   TRUE      FALSE         TRUE
#4         12734   TRUE       TRUE         TRUE
#5         73642   TRUE      FALSE         TRUE

可以使用ifelse或将逻辑向量转换为数字索引来将其更改为“是/否”

pmap(df1, ~
         df2 %>% 
            transmute(!! ..1 := c("N", "Y")[1 + (PropertyValue < 2.6 * ..2)])) %>%
    bind_cols(df2, .)

或使用sapply中的base R

cbind(df2, sapply(setNames(2.6 * df1$MedianWage, df1[[1]]), `>`, df2$PropertyValue))

注意:最好有一个逻辑列(TRUE/FALSE)而不是Y/N

数据

df1 <- structure(list(Job = c("Lawyer", "Bus Driver", "Retail Sales"
), MedianWage = c(104756L, 26598L, 48923L)), .Names = c("Job", 
"MedianWage"), class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(PropertyValue = c(927346L, 12345L, 87492L, 12734L, 
73642L)), .Names = "PropertyValue", class = "data.frame", row.names = c(NA, 
-5L))

答案 1 :(得分:1)

Map的值,并根据匹配的名称填写它们:

df2[df1$Job] <- Map(function(mw,pv) pv < (2.6*mw), df1[["MedianWage"]], df2["PropertyValue"])

#  PropertyValue Lawyer Bus Driver Retail Sales
#1        927346  FALSE      FALSE        FALSE
#2         12345   TRUE       TRUE         TRUE
#3         87492   TRUE      FALSE         TRUE
#4         12734   TRUE       TRUE         TRUE
#5         73642   TRUE      FALSE         TRUE