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

标签 r dataframe vector

预先感谢您的帮助!

目标:我正在查看住房负担能力数据,构建一个按职业显示住房负担能力的工具。我有一个职业及其工资中位数的数据框架,以及该地区所有特性的所有房屋值(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/

相关文章:

r - 在geom_boxplot中包含用于填充美学的缺失因子水平的空间

python - 使用多列进行 Pandas 滚动应用

python - 合并包含列表的数据框列

python - Pandas 如何获取连续日期和销售额超过 1000 的行?

C程序查询彩票号码: why some tests fail?

r - 延迟进入生存模型。 R 与 Stata 差异

r - 使用 tidyverse 工具展平从关系数据库派生的嵌套列表的最佳方法是什么?

r - 如何在knitr中获取 block 名称?

C++ vector of priority_queue of strings with custom strings comparator

c++ - 将特征向量复制到 C 数组?