我被一个相当复杂的问题困住了。我有一个数据框,有三行:id、info和rownum。数据看起来像这样:
现在我想做的是,如果一行包含信息a,则删除一个id的所有其他行。例如,这意味着应删除第2行和第3行,因为第1行的列信息包含值a。请注意,信息值未排序(id 3/行5&6),并且由于其他数据限制,无法排序。
我的解决方案工作得很好。然而,它非常、非常、非常缓慢,因为原始数据包含超过700k行和超过150k行的“a”值。
我可以使用一个带有4个核心的foreach循环来加速它,但也许有人能给我一个更好的解决方案的提示。
此致
阿恩
[更新]
结果应该是:
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
现在我想做的是,如果一行包含信息a,则删除一个id的所有其他行。例如,这意味着应删除第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)
}
}
}
}
}
我的解决方案工作得很好。然而,它非常、非常、非常缓慢,因为原始数据包含超过700k行和超过150k行的“a”值。
我可以使用一个带有4个核心的foreach循环来加速它,但也许有人能给我一个更好的解决方案的提示。
此致
阿恩
[更新]
结果应该是:
id info row
1 a 1
2 a 4
3 a 6
4 b 7
4 c 8
data[!(data$id %in% unique(data$id[data$info=="a"])),]
是否解决了你的问题? - sebastian-c