gpt4 book ai didi

如果至少有一个组成员满足条件,则从 data.frame 中删除组

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

我有一个 data.frame,如果其中的任何成员满足条件,我希望删除整个组。

在第一个示例中,如果值是数字并且条件是NA,则下面的代码有效。

df <- structure(list(world = c(1, 2, 3, 3, 2, NA, 1, 2, 3, 2), place = c(1, 
1, 2, 2, 3, 3, 1, 2, 3, 1), group = c(1, 1, 1, 2, 2, 2, 3,
3, 3, 3)), .Names = c("world", "place", "group"), row.names = c(NA,
-10L), class = "data.frame")

ans <- ddply(df, . (group), summarize, code=mean(world))
ans$code[is.na(ans$code)] <- 0
ans2 <- merge(df,ans)
final.ans <- ans2[ans2$code !=0,]

但是,如果条件不是“NA”,或者如果值是非数字的。

例如,如果我想删除具有 world 值为 AF 的一行或多行的组(如下面的数据框中所示),则此 ddply 技巧不起作用。

df2 <-structure(list(world = structure(c(1L, 2L, 3L, 3L, 3L, 5L, 1L, 
4L, 2L, 4L), .Label = c("AB", "AC", "AD", "AE", "AF"), class = "factor"),
place = c(1, 1, 2, 2, 3, 3, 1, 2, 3, 1), group = c(1,
1, 1, 2, 2, 2, 3, 3, 3, 3)), .Names = c("world", "place",
"group"), row.names = c(NA, -10L), class = "data.frame")

我可以设想一个 for 循环,其中对于每个组,检查每个成员的值,如果满足条件,则可以填充 code 列,然后我可以根据在该代码上。

但是,也许有一种矢量化的方法可以做到这一点?

最佳答案

尝试

library(dplyr)
df2 %>%
group_by(group) %>%
filter(!any(world == "AF"))

或者按照@akrun提到的:

setDT(df2)[, if(!any(world == "AF")) .SD, group]

或者

setDT(df2)[, if(all(world != "AF")) .SD, group]

这给出:

#Source: local data frame [7 x 3]
#Groups: group
#
# world place group
#1 AB 1 1
#2 AC 1 1
#3 AD 2 1
#4 AB 1 3
#5 AE 2 3
#6 AC 3 3
#7 AE 1 3

关于如果至少有一个组成员满足条件,则从 data.frame 中删除组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31661704/

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