私は非常に複雑な問題で立ち往生しています。id、info、rownum の 3 行のデータ フレームがあります。データは次のようになります。
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
私が今やりたいことは、行の1つに情報が含まれている場合、1つのIDの他のすべての行を削除することですa。これは、たとえば、行1の列情報に値aが含まれているため、行2と3を削除する必要があることを意味します。情報値は順序付けされておらず (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 万行を超える行と、「a」値を持つ 15 万行を超える行が含まれているため、非常に非常に遅くなります。
4 コアのforeachループを使用して高速化することもできますが、誰かがより良い解決策のヒントを教えてくれるかもしれません。
よろしく、
アルネ
[アップデート]
結果は次のようになります。
id info row
1 a 1
2 a 4
3 a 6
4 b 7
4 c 8