【问题标题】:Partial duplicates in rr中的部分重复
【发布时间】:2013-09-16 14:03:09
【问题描述】:

我正在处理一个大数据框,看起来像这个

             X V1 V2 V3
1 IOJRE.no.m-1 10  2  0
2 IOJRE.no.m-2 10  7  0
3 OHIJR.no.m-4  5  5  1
4 OHIJR.no.m-6  5  6  1
5 OHIJR.no.m-3  3  3  1
6 OHIJR.no.m-1  2  3  1
7 ABCDE.no.m-1  5  6  0
8 ABCDE.no.m-5  1  4  0

> dput(mydata)
structure(list(X = structure(c(3L, 4L, 7L, 8L, 6L, 5L, 1L, 2L
), .Label = c("ABCDE.no.m-1", "ABCDE.no.m-5", "IOJRE.no.m-1", 
"IOJRE.no.m-2", "OHIJR.no.m-1", "OHIJR.no.m-3", "OHIJR.no.m-4", 
"OHIJR.no.m-6"), class = "factor"), V1 = c(10, 10, 5, 5, 3, 2, 
5, 1), V2 = c(2, 7, 5, 6, 3, 3, 6, 4), V3 = c(0, 0, 1, 1, 1, 
1, 0, 0)), .Names = c("X", "V1", "V2", "V3"), row.names = c(NA, 
8L), class = "data.frame")

第一列中许多项目的前 5 个字母相似。我正在尝试对数据进行子集化,只保留其中一个具有最高 V1 值的类似项目。 (如果V1值一样,我留哪一个都没关系)。

我想不出合适的命令,因为这不是duplicated()。我想过使用aggregate() 然后which.max() 但我真的无法为这项工作构造一个合适的命令。 这是我想要的输出。

             X V1 V2 V3
1 IOJRE.no.m-1 10  2  0
2 OHIJR.no.m-4  5  5  1
3 ABCDE.no.m-1  5  6  0


> dput(mydata2)
structure(list(X = structure(c(2L, 3L, 1L), .Label = c("ABCDE.no.m-1", 
"IOJRE.no.m-1", "OHIJR.no.m-4"), class = "factor"), V1 = c(10L, 
5L, 5L), V2 = c(2L, 5L, 6L), V3 = c(0L, 1L, 0L)), .Names = c("X", 
"V1", "V2", "V3"), class = "data.frame", row.names = c(NA, -3L
))

谁能帮我解决这个问题?

非常感谢,

【问题讨论】:

    标签: r duplicates dataframe subset duplicate-removal


    【解决方案1】:

    这是一种 data.table 方法(可能不是最好的,但它有效且速度快)

    library("data.table")
    mydata <- data.table(mydata)
    mydata[,X:=strtrim(X,5)]
    setkey(mydata,X,V1)
    mydata[unique(X),mult="last"]
    
           X V1 V2 V3
    1: ABCDE  5  6  0
    2: IOJRE 10  7  0
    3: OHIJR  5  6  1
    

    【讨论】:

    • 感谢您的回答。似乎我还没有将这些功能安装到我的 R 中。抱歉,我无法应用您在上面发布的命令。
    • install.packages("data.table"),就是这样
    • 啊,我没有意识到 data.table 是包名。我在上面:) 谢谢
    • 不客气。与 Asayats 的回答相比,它会相当快
    • 哇是的!几秒钟!这很有帮助。谢谢
    【解决方案2】:

    可能不是最快的方法,但它回答了你的问题:)

    1) 对您的第一个变量进行子串化:

    substr(x$X,1,5)
    

    2) 求每组子串的最大值

    y <- lapply(split(x, substr(x$X,1,5)), function(x) {
    x[which.max(x$V1),]})
    

    3) 从结果中创建新的数据框:

    do.call(rbind, y)
    

    【讨论】:

    • 您好 Asayat,该命令运行良好,但计算需要很长时间。但它最终奏效了。干杯。
    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多