gpt4 book ai didi

r - 根据两个单独的匹配要求删除一行

转载 作者:行者123 更新时间:2023-12-02 08:04:59 24 4
gpt4 key购买 nike

如果有关于此的帖子,我深表歉意 - 我搜索了很多次答案,但找不到任何有用的东西。

我需要做的是删除以下示例中等于 66 的所有行,前提是存在重复的动物类型且除 66 以外的任何其他类型。

animals <- c("dog", "dog", "dog", "cat", "cat", "cat", "mouse", "mouse", "rat", "rat")
number <- c(1,2,66,2,66,66,66,66,2,1)

df <- data.frame(animals,number)

使用那个 df 我想删除第 3 行,因为 dog 的其他值为 1 和 2,我想删除 cat 的两个 66,因为有一只 cat 的其他值为 2 但我不想删除鼠标条目,因为它们都是 66,而且我不想用 rat 删除任何内容,因为没有 66 值。

我最终会得到类似这样的东西:

animals <- c("dog", "dog", "cat", "mouse", "mouse", "rat", "rat")
number <- c(1,2,2,66,66,2,1)

在真实的数据集中有太多的条目,你根本无法使用计数并删除所有总计少于 66 的东西(这是我的第一直觉)

这是我第二次尝试,但出于某种原因无法考虑。

df(!number == 66 | if(unique(animals) ==

可能涉及哪个语句?任何帮助将不胜感激!

最佳答案

一种使用 base R ave 的方法,我们检查是否有任何动物的数字不是 66,如果有,则我们返回忽略 66 的数字,否则返回所有行。

df[with(df, ave(number != 66, animals, FUN = function(x) if (any(x)) x else !x)), ]


# animals number
#1 dog 1
#2 dog 2
#3 cat 2
#4 mouse 66
#5 mouse 66
#6 rat 2
#7 rat 1

dplyr 版本将过滤其中包含所有 66 个的组,否则忽略包含 66 个的行。

library(dplyr)

df %>%
group_by(animals) %>%
filter(all(number == 66) | number != 66)

# animals number
# <fct> <dbl>
#1 dog 1
#2 dog 2
#3 cat 2
#4 mouse 66
#5 mouse 66
#6 rat 2
#7 rat 1

关于r - 根据两个单独的匹配要求删除一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52601748/

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