【问题标题】:How to keep in data frame every ID once preferring largest value fist in case of tie newest in case of tie random如何将每个 ID 保存在数据帧中,一旦出现平局,则选择最大值拳头,以防平局随机
【发布时间】:2020-04-20 10:32:22
【问题描述】:

我有一个大约 250K obs 的大型 DF。以及关于人们毕业数据的 19 个变量。人们多次在DF中。我需要制作两个新的 DF,其中每个人每个 DF 只出现一次(ID)。我真正的 DF 有更多列,但例如我取出了 3 个需要的列和 2 个作为我的 DF 中其他背景信息的示例。

ID - 个人的唯一 ID

Level - 显示教育水平。数字越大越好:示例 8 = 博士,7 = 硕士

年份 - 毕业年份

Field - 研究领域的背景信息。我们需要保留这些数据。

性别 - 人的性别。我们需要保留这些数据。

 原版 DF 命名为“Graduations”
ID 级别 年份 字段 性别
1 4 2016 31 百万
1 5 2016 43 百万
2 6 2010 12 楼
2 7 2012 12 楼
2 8 2017 19 楼
3 5 2011 12 楼
3 5 2009 31 女
4 6 2018 43 百万
4 6 2018 44 百万
5 5 2015 19 万
5 6 2011 32 M

DF 1 被命名为“最高”,意思是最高等级的毕业。在这个 DF 中,我们只保留该人已达到最高教育水平的行。如果一个人达到它的次数超过一次,那么我们保留最高和最新毕业的那一行,如果两者都是平局,那么我们随机选择一个。

 “最高”
ID 级别 年份 字段 性别
1 5 2016 43 M(保留行,因为它是最高级别)
2 8 2017 19 F(保留行,因为它是最高级别)
3 5 2011 12 F(保留行,因为它是最高级别和最新的)
4 6 2018 43 M(随机选择的行)
5 6 2011 32 M(行保留,因为它是最高级别)

DF 2 被命名为“Last”,意思是最后获得的毕业级别。在这个 DF 中,我们只保留最新数据的行。如果一个人每年毕业一次以上,那么我们选择最高级别,如果那也是一个平局,然后随机(不需要与 DF1 中相同的随机行)

 "最后"
ID 级别 年份 字段 性别
1 5 2016 43 M(保留行,因为它是最新和最高级别)
2 8 2017 19 F(保留行,因为它是最新的)
3 5 2011 12 F(保留行,因为它是最新的)
4 6 2018 44 M(随机选择的行)
5 5 2015 19 M(保留行,因为它是最新的)

我试图在 stackoverflow 上搜索它,但没有找到我要找的东西。我可能使用了错误的关键字。

我更喜欢基本的 R 函数,但如果需要,最常见的包也可以。这是因为此 DF 位于安全计算机上,并且安装不常见的软件包需要很长时间,因为我必须提出请求。最常见的已经安装了。

感谢您的帮助。

【问题讨论】:

    标签: r random


    【解决方案1】:

    data.table 解决方案

    它不是很优雅,但它确实有效。

    library(data.table)
    
    dt <- fread('ID    Level     Year     Field     Gender
    1       4       2016      31         M
    1       5       2016      43         M
    2       6       2010      12         F
    2       7       2012      12         F
    2       8       2017      19         F
    3       5       2011      12         F
    3       5       2009      31         F
    4       6       2018      43         M
    4       6       2018      44         M
    5       5       2015      19         M
    5       6       2011      32         M')
    
    df1 <- dt[,head(.SD[Level==max(Level)],1),by = .(ID)]
    
    df2 <- dt[,highest_lvl_year:=max(Level),.(ID,Year)][,
                flag:=fifelse(Year==max(Year),fifelse(Level==highest_lvl_year,"Y","N"),"N"),by=.(ID)][,
                head(.SD[flag=="Y"],1),by=.(ID)]
    df1
    #>    ID Level Year Field Gender
    #> 1:  1     5 2016    43      M
    #> 2:  2     8 2017    19      F
    #> 3:  3     5 2011    12      F
    #> 4:  4     6 2018    43      M
    #> 5:  5     6 2011    32      M
    df2[,1:5]
    #>    ID Level Year Field Gender
    #> 1:  1     5 2016    43      M
    #> 2:  2     8 2017    19      F
    #> 3:  3     5 2011    12      F
    #> 4:  4     6 2018    43      M
    #> 5:  5     5 2015    19      M
    

    reprex package (v0.3.0) 于 2020-04-20 创建

    【讨论】:

    • 如果我输入第一个代码,我会收到以下错误:头部错误(.SD["Level" == max(Level)], 1) : object 'Level' not found。当我将 Level,s 更改为“Level”时,它会运行,但 df1 上有 0 个变量。当我运行第二个代码时出现错误::=(highest_lvl_year, max(Level)) 中的错误:检查 is.data.table(DT) == TRUE。否则,:= 和 :=(...) 被定义为在 j 中使用,仅一次且以特定方式使用。请参阅帮助(“:=”)。代码很复杂,我无法理解我做错了什么。
    • 您可以在所有这些代码之前尝试setDT(your dataset),并确保您的列名与代码对齐
    猜你喜欢
    • 2019-02-01
    • 2016-02-01
    • 2022-10-16
    • 2019-10-07
    • 2011-10-10
    • 2011-03-08
    相关资源
    最近更新 更多