我遇到了一个非常复杂的问题。我有一个包含三行的数据框:id、info 和 rownum。数据如下所示:
id info row
1 a 1
1 b 2
1 c 3
2 a 4
3 b 5
3 a 6
4 b 7
4 c 8
我现在要做的是删除一个 id 的所有其他行,如果其中一行包含信息a。这意味着例如第2行和第 3行应该被删除,因为第1行的列信息包含值a。请注意,信息值未排序(id 3/第 5 行和第 6 行)并且由于其他数据限制而无法排序。
我使用for 循环解决了这个问题:
# select all id containing an "a"-value
a_val <- data$id[grep("a", data$info)]
# check for every id containing an "a"-value
for(i in a_val) {
temp_data <- data[which(data$id == i),]
# only go on if the given id contains more than one row
if (nrow(temp_data) > 1) {
for (ii in nrow(temp_data)) {
if (temp_data$info[ii] != "a") {
temp <- temp_data$row[ii]
if (!exists("delete_rows")) {
delete_rows <- temp
} else {
delete_rows <- c(delete_rows, temp)
}
}
}
}
}
我的解决方案效果很好。然而,它非常、非常、非常慢,因为原始数据包含超过 70 万行和超过 15 万行的“a”值。
我可以使用具有 4 个核心的foreach循环来加速它,但也许有人可以给我一个提示以获得更好的解决方案。
最好的问候,
阿恩
[更新]
结果应该是:
id info row
1 a 1
2 a 4
3 a 6
4 b 7
4 c 8