gpt4 book ai didi

r - 多行删除 : delete row depending on other row

转载 作者:行者123 更新时间:2023-12-01 12:49:31 28 4
gpt4 key购买 nike

我遇到了一个相当复杂的问题。我有一个包含三行的数据框: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。这意味着,例如,行 23 应该被删除,因为行 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

最佳答案

这是一种可能的解决方案。

首先找到info包含"a"id:

ids <- with(data, unique(id[info == "a"]))

子集数据:

subset(data, (id %in% ids & info == "a") | !id %in% ids)

输出:

  id info row
1 1 a 1
4 2 a 4
6 3 a 6
7 4 b 7
8 4 c 8

另一种解决方案(可能更难破译):

subset(data, info == "a" | !rep.int(tapply(info, id, function(x) any(x == "a")),
table(id)))

注意。 @BenBarnes 发现此解决方案仅在数据框根据 id 排序时才有效。

关于r - 多行删除 : delete row depending on other row,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13563699/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com