预先感谢您的帮助!
目标:我正在查看住房负担能力数据,构建了一个按职业显示住房负担能力的工具。我有一个职业及其中位数工资的数据框,以及该地区所有房地产的所有房屋价值的数据框。
挑战:我正在寻找一种方法,可以将每个房屋价值与针对每个职业的可负担性指标进行比较,并使用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。任何想法将不胜感激!
答案 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