【问题标题】:R filtering rows where multiple column values do not matchR过滤多列值不匹配的行
【发布时间】:2022-01-18 09:13:56
【问题描述】:

在 R 中,我试图过滤数据帧中许多列不相等的行。

示例:(我的实际数据框有更多列)

data.frame(id = c(1, 2, 3, 4, 5), xx = c("no", "no", "yes", "yes", "no"), x1 = c("m", "f", "f", "f", "m"), x2 = c("m", "f", "f", "m", "m"), x3 = c("m", "u", "f", "m", NA), x4 = c("m", "f", "m", "m", "f"), x5 = c(NA, "f", "m", "u", "f"))

id  xx x1 x2   x3 x4   x5
1  1  no  m  m    m  m <NA>
2  2  no  f  f    u  f    f
3  3 yes  f  f    f  m    m
4  4 yes  f  m    m  m    u
5  5  no  m  m <NA>  f    f

#what I want
id  xx x1  x2 x3 x4 x5
3  yes  f  f  f  m  m
4  yes  f  m  m  m  u
5  no  m  m <NA> f  f

我想比较 x1:x5(不是 id 或 xx)。如果所有列都相等(NA 值不计算在内),则过滤掉该行(示例中的第 1 行)。如果所有列都相等,但组合是 m 和 u 或 f 和 u,则也过滤掉这些行(示例中的第 2 行)。我只想以任意组合保留同时存在 m 和 f 的行。我更喜欢 tidyverse 解决方案,但任何方法都可以。

谢谢!

【问题讨论】:

  • 需要更广泛的示例。不清楚“m 和 f 在一起”是什么意思。
  • 很抱歉。我编辑了这个问题。如果还不清楚,请告诉我。
  • fmu 是否可用?
  • 所以要明确,必须至少有一个“m”和一个“f”,而且你真的不在乎有多少个“u”或 NA?
  • 如果 f 和 m 和 u 在一起,我希望保留该行(如示例中的第 4 行)。是的,我不在乎你和NA。

标签: r dplyr


【解决方案1】:

我认为您可以将 rowSums("x_n" columns) == "f" > 0 AND rowSums("x_n"'s) >0 作为逻辑索引:

xcols <- dfrm[grepl("x[1-5]", names(dfrm))]

dfrm[ rowSums(xcols =="f", na.rm=TRUE)>0 & rowSums(xcols =="m", na.rm=TRUE) >0  , ]
  id  xx x1 x2   x3 x4 x5
3  3 yes  f  f    f  m  m
4  4 yes  f  m    m  m  u
5  5  no  m  m <NA>  f  f

【讨论】:

  • 谢谢!我去了 dplyr 路线,但我很感激。
【解决方案2】:

虽然有点乱,但是很管用。

df %>%
  rowwise %>%
  mutate(a = paste0(unique(unlist(list(across(x1:x5, ~.x))) %>% na.omit) %>% sort, collapse = "")) %>%
  filter(nchar(a) != 1, !a %in% c("fu", "mu")) %>%
  select(-a)

     id xx    x1    x2    x3    x4    x5   
  <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
1     3 yes   f     f     f     m     m    
2     4 yes   f     m     m     m     u    
3     5 no    m     m     NA    f     f  

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2020-01-27
  • 1970-01-01
  • 2020-12-25
相关资源
最近更新 更多