gpt4 book ai didi

r - 通过与另一列匹配来过滤一列

转载 作者:行者123 更新时间:2023-12-02 08:01:48 27 4
gpt4 key购买 nike

我有一个数据框,其中包含一个变量,如果它们与另一个变量中的元素匹配,则要删除的元素 - 请参见下面的一个小示例:

df <- data.frame(pair = c(1, 1, 2, 2, 3, 3),
animal = rep(c("dog", "cat"), 3),
value = seq(1, 12, 2),
drop = c("no", "no", "dog", "dog", "cat", "cat"))

pair animal value drop
1 1 dog 1 no
2 1 cat 3 no
3 2 dog 5 dog
4 2 cat 7 dog
5 3 dog 9 cat
6 3 cat 11 cat

我想根据 animal 的值是否与 drop 的值匹配来过滤数据框。我想要像 filter(df, animal != drop) 这样的东西来删除只有 animal 的值与 drop 的值匹配的行:

  pair animal value drop
1 1 dog 1 no
2 1 cat 3 no
4 2 cat 7 dog
5 3 dog 9 cat

我还尝试编写一个简单的循环来测试每行是否有动物匹配项,如果为真则删除该行,但我无法让它工作。 (我对循环不是很有信心,如果可能的话我宁愿不使用循环,因为我的数据框非常大但我变得绝望了!)

for(i in nrow(df)){
if(df$animal[i] == df$drop[i]){
df <- df[-i,]
return(df)
}
}

有没有办法使用 dplyr 做到这一点?

最佳答案

filter(df, animal != drop) 的使用是正确的。但是,由于您没有在 data.frame() 调用中指定 stringsAsFactors = F,因此所有字符串都转换为因子,从而提高了不同水平集的误差。因此添加 stringsAsFactors = F,应该可以解决这个问题

df <- data.frame(pair = c(1, 1, 2, 2, 3, 3),
animal = rep(c("dog", "cat"), 3),
value = seq(1, 12, 2),
drop = c("no", "no", "dog", "dog", "cat", "cat"),
stringsAsFactors = F)

df %>%
filter(animal != drop)

pair animal value drop
1 1 dog 1 no
2 1 cat 3 no
3 2 cat 7 dog
4 3 dog 9 cat

为了避免这个不需要的字符串引起问题,我强烈建议使用 tibble

如果没有机会更改数据的创建方式,我在这里包括@akrun 的解决方案:

library(dplyr)

df %>%
mutate_at(vars(animal, drop), as.character) %>%
filter(animal != drop)
# pair animal value drop
#1 1 dog 1 no
#2 1 cat 3 no
#3 2 cat 7 dog
#4 3 dog 9 cat

关于r - 通过与另一列匹配来过滤一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56345162/

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