【问题标题】:Creating a new variable from the ranges of another column in which the ranges change - R从范围更改的另一列的范围创建新变量 - R
【发布时间】:2020-10-15 11:03:16
【问题描述】:

我是 R 的初学者,如果这是一个非常简单的问题,我很抱歉。我看了,但我找不到同样的问题。

我想从 R 中另一列的范围创建一个新变量,但每一行的范围都不相同。

更具体地说,我的数据有 1960 年 - 2000 年,我有就业范围。对于 1960 年到 1980 年,老师是 1,律师是 2 等等。对于 1980 - 1990 年,老师的值范围是 1-29,律师是 50-89 等等。最后,对于 1990-2000 年,教师的值范围是 40-65,对于律师来说是 1-39。

我什至不知道如何开始(教师和律师不是唯一的职业,有 10 个不同的职业在不同年份的价值范围重叠——这让我很困惑)。

感谢您的帮助。非常感谢。

【问题讨论】:

  • 嗨,tommy,你能分享 R 的 dput() 函数的可重现示例并显示预期输出吗?
  • 您好 Karthik,感谢您的回复。由于我的数据受到限制,我无法展示示例。但我想最终得到一个变量,看起来像每个人的年份职业 1960 年教师 1960 年律师 ... 1980 年教师 1980 年律师等
  • 它必须是矩阵形式。我看我做不到。对不起

标签: r


【解决方案1】:

这里有几种方法可以帮助您入门。

首先,假设您有一个包含yearoccupation_code 的数据框:

df1 <- data.frame(
  year = c(1965, 1985, 1995),
  occupation_code = c(1, 2, 3)
)

  year occupation_code
1 1965               1
2 1985               2
3 1995               3

然后,创建第二个数据框,该数据框将清楚地指示每个职业的年份范围和职业代码范围。您可以在此处填写您的所有职业。

df2 <- data.frame(
  year_start = c(1960, 1960, 1980, 1980, 1990, 1990),
  year_end = c(1980, 1980, 1990, 1990, 2000, 2000),
  occupation_code_start = c(1, 2, 1, 50, 40, 1),
  occupation_code_end = c(1, 2, 29, 89, 65, 39),
  occupation = c("teacher", "lawyer", "teacher", "lawyer", "teacher", "lawyer")
)

  year_start year_end occupation_code_start occupation_code_end occupation
1       1960     1980                     1                   1    teacher
2       1960     1980                     2                   2     lawyer
3       1980     1990                     1                  29    teacher
4       1980     1990                    50                  89     lawyer
5       1990     2000                    40                  65    teacher
6       1990     2000                     1                  39     lawyer

然后,您可以将两者合并在一起。

一种方法是使用data.table 包。

library(data.table)

setDT(df1)
setDT(df2)

df2[df1,
    on = .(year_start <= year, 
           year_end >= year, 
           occupation_code_start <= occupation_code, 
           occupation_code_end >= occupation_code),
    .(year, occupation = occupation)]

这会给你:

   year occupation
1: 1965    teacher
2: 1985    teacher
3: 1995     lawyer

另一种方法是使用fuzzyjointidyverse

library(tidyverse)
library(fuzzyjoin)

fuzzy_left_join(df1, df2,
                by = c("year" = "year_start",
                       "year" = "year_end",
                       "occupation_code" = "occupation_code_start",
                       "occupation_code" = "occupation_code_end"),
                match_fun = list(`>=`, `<=`, `>=`, `<=`)) %>%
  select(year, occupation)

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多