如果 R 中给出了条件,如何按组过滤数据并删除值?

How to filter data by group and remove values if a condition is given in R?

提问人:M Sandoval 提问时间:7/26/2022 更新时间:7/26/2022 访问量:55

问:

我想在 R 中使用 dplyr 过滤数据库,但删除那些幅度相差为 1e-5 的行。我的数据是这样的:

价值
第 1 组 3.02E-90型
第 1 组 3.02E-89型
第 2 组 3.02E-90型
第 2 组 3.02E-90型
第 2 组 3.02E-10
第 3 组 3.02E-88型
第 3 组 3.02E-90型
第 3 组 3.02E-89型

在此数据中,我想从 group2 (3.02e-10) 中删除第 5 行,因为它与 group2 中的其他值相差 1e-5 数量级。换句话说,我希望能够删除所有与其他观测值相差 5 个小数单位的观测值,并保留其余值。我尝试了不同的代码,但没有任何效果,我只能计算出以下差异:

df<- input %>%
  group_by(Group) %>% 
  mutate(difference = c(0,diff(Value)))

先谢谢你,

R 数据库 DPLYR 数据操作

评论

0赞 r2evans 7/26/2022
虽然我可以看到使用 和 的组合来确定值之间的差异,但您是否需要处理(例如)在 和 处具有相等数字的组?我推断您更愿意保留其他值的异常值,但如果较高值和较低值的计数相同(或几乎相同),则可能不那么明显。outerrowSums3e-903e-10

答:

0赞 M Sandoval 7/26/2022 #1

我可以做我想做的事,解决方案很简单。计算值列中的小数位数:

countdec <- function(x) {
 if ((x %% 1) != 0) {
   strs <- strsplit(as.character(format(x, scientific = F)), "\\.")
    n <- nchar(strs[[1]][2])
  } else {
   n <- 0
  }
  return(n) 
}

应用以下功能:

input$ndec <-  sapply(input$value, FUN = countdec )

然后,提取小数位数的差值:

library(dplyr)
df<- input %>%
 group_by(group) %>%
 mutate(diff = ndec - ndec[1], 
 diff = replace(diff, row_number() == 1, NA)) 

然后将 NA 更改为零:

df$diff[is.na(df$diff)] <- 0

乘以 -1 得到正值:

df$diff<-  df$diff *-1

最后,过滤掉十进制值小于 5 的行。

df %>% filter(diff <= 5)