我正在使用一个大数据框,看起来像这个
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
))
任何人都可以帮我吗?
非常感谢,
答案 0 :(得分:2)
这是一个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
答案 1 :(得分: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)