预先感谢您的帮助!
目标:我正在查看住房负担能力数据,构建一个按职业显示住房负担能力的工具。我有一个职业及其工资中位数的数据框架,以及该地区所有特性的所有房屋值(value)的数据框架。
挑战:我正在寻找一种方法,将每个房屋值(value)与每个职业特定的负担能力指标进行比较,并用 TRUE/FALSE、Y/N 或如果房屋值(value)低于指标,则为 1/0。最终结果将是数据框,其中房屋值(value)作为观察值,每个职业有一列。
这里有一些示例代码可以更好地说明问题:
我正在尝试将其结合起来:
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。任何想法将不胜感激!
最佳答案
我们可以使用purrr
中的map2
来做到这一点。循环遍历 'Job' 、 'MedianWage' 的各个元素的行,检查第二个数据集中的 'PropertyValue' 是否小于 'MedianWage' 的 2.6 倍,以创建逻辑列并绑定(bind) 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
或将逻辑向量转换为数字索引来将其更改为“Y/N”
pmap(df1, ~
df2 %>%
transmute(!! ..1 := c("N", "Y")[1 + (PropertyValue < 2.6 * ..2)])) %>%
bind_cols(df2, .)
或者使用base R
中的sapply
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))
关于r - 检查一个向量中的值是否小于另一向量(不同长度)中的值,并用 Y/N 答案填充表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957595/