【问题标题】:R - Remove all rows that do not match certain criteriaR - 删除所有不符合特定条件的行
【发布时间】:2021-11-02 23:55:47
【问题描述】:

下面是我的数据的样子。我的目标是找到所有与 x、z 和 m 匹配但 y 不同的行。而且我需要保留两个或全部具有不同 y 的那些。

我该怎么做?

x <- c("A","B","C","B","D","E","E")
y <- c(0,10,10,10,10,12,0)
z <- c("A1","B1","B1","B1","B1","C1","C1")
m <- c(rep("2017-12-28",7))

df <- data.frame(x,y,z,m)
df

# Below is the goal
df[6:7,]

【问题讨论】:

  • 你在比较什么?行的值与什么相同或不同?
  • 目标中显示的第 6 行和第 7 行匹配 x、z 和 m,但不同的 y。所以它是所有匹配的,但不同的 y,只要保留所有不同的 y 行。
  • 你还没有定义你所称的match
  • 如果df[ave(df[["y"]], df[c("x","z","m")], FUN=\(x) length(unique(x)) ) &gt; 1,] 之类的东西符合您的要求,可以肯定这是重复的。也许stackoverflow.com/questions/50953598/…本质上或stackoverflow.com/questions/12840294/…
  • 我链接的第二个问题建议 - df %&gt;% group_by(x,z,m) %&gt;% filter(n_distinct(y) &gt; 1)

标签: r


【解决方案1】:

基础 R

df[ave(df$y, df[,c("x","z","m")], FUN = function(y) length(unique(y))) > 1,]
#   x  y  z          m
# 6 E 12 C1 2017-12-28
# 7 E  0 C1 2017-12-28

请注意,由于ave 强制其返回值与第一个参数相同的class 的方式,如果y 不是numericinteger,这可能无法按预期完美运行.

此外,对于代码高尔夫或可读性,如果您更喜欢 ave 解决方案但已加载其中一个包,您可以将 FUN= 参数替换为 FUN=dplyr::n_distinctdata.table::uniqueN 之一。

dplyr

library(dplyr)
df %>%
  group_by(x, z, m) %>%
  filter(n_distinct(y) > 1) %>%
  ungroup()
# # A tibble: 2 x 4
#   x         y z     m         
#   <chr> <dbl> <chr> <chr>     
# 1 E        12 C1    2017-12-28
# 2 E         0 C1    2017-12-28

数据表

library(data.table)
as.data.table(df)[, .SD[uniqueN(y) > 1,], by = .(x, z, m)]
#         x      z          m     y
#    <char> <char>     <char> <num>
# 1:      E     C1 2017-12-28    12
# 2:      E     C1 2017-12-28     0

数据

df <- structure(list(x = c("A", "B", "C", "B", "D", "E", "E"), y = c(0, 10, 10, 10, 10, 12, 0), z = c("A1", "B1", "B1", "B1", "B1", "C1", "C1"), m = c("2017-12-28", "2017-12-28", "2017-12-28", "2017-12-28", "2017-12-28", "2017-12-28", "2017-12-28")), class = "data.frame", row.names = c(NA, -7L))

【讨论】:

  • 不确定是否有必要加入,如果订单很重要,您可以select - df %&gt;% group_by(x,z,m) %&gt;% filter(n_distinct(y) &gt; 1) %&gt;% select(names(df))
  • 当您发表评论时,我正在测试类似的东西,感谢您朝正确方向的最后推动:-)
猜你喜欢
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多