【问题标题】:Allocating values from one dataframe to another将值从一个数据帧分配到另一个数据帧
【发布时间】:2021-03-05 12:27:26
【问题描述】:

我有以下数据框

OCC1990     Skilllevel
 3             1
 8             2
 12            2
 14            3
 15            1 

如上图所示,它包含一长串分配给特定技能水平的职业。 我的实际数据框是一个包含数百万行的家庭调查,其中包括一个名为OCC1990 的列。 我的目标是将上面列出的数据框架中我指定的技能水平应用到家庭调查中。

我过去已经为较小的数据帧应用了以下代码,这是一种非常手动的方式

cps_data[cps_data$OCC1990  %in% 3,"skilllevel"] <- 1
cps_data[cps_data$OCC1990  %in% 4:7,"skilllevel"] <- 1
cps_data[cps_data$OCC1990  %in% 8,"skilllevel"] <- 2

但由于我不想花几个小时复制粘贴,而且它增加了出错的可能性,我正在寻找一种不同的、更直接的方法。

我已经尝试合并两个数据帧,但这会导致与向量大小相关的错误。

除了合并两个数据框之外,还有其他方法可以将技能水平也分配给调查中的职业吗?

非常感谢提前 Xx弗雷迪

【问题讨论】:

    标签: r


    【解决方案1】:

    对大型数据集使用data.table

    创建两个向量:levelslabelslevels 包含唯一值 OCC1990labels 包含您要应用的新技能级别。

    现在在factor函数中使用levelslabels来修改技能等级。 (我用Skilllevel = 3 代替OCC1990 = 8)

    library(data.table)
    setDT(df)
    levels <- c(3:7,8)        # unique values of OCC1990
    labels <- c(rep(1,5), 3)  # new Skill levels corresponding to OCC1990
    setkey(df, OCC1990)       # sort OCC1990 for speed before filtering
    df[ OCC1990 %in% levels, Skilllevel := as.integer(as.character(factor(OCC1990, levels = levels, labels = labels)))]
    head(df)
    #   OCC1990 Skilllevel
    #1:       3          1
    #2:       8          3
    #3:      12          2
    #4:      14          3
    #5:      15          1
    

    如果您仍然面临内存大小问题,请从 IO 中读取数据块(使用 fread)并应用上述操作,然后将数据附加到新文件中。

    数据:

    df <- read.table(text='OCC1990     Skilllevel
     3             1
     8             2
     12            2
     14            3
     15            1 ', header=TRUE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 2020-06-16
      • 2023-03-25
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多