提问人:M Sandoval 提问时间:7/26/2022 更新时间:7/26/2022 访问量:55
如果 R 中给出了条件,如何按组过滤数据并删除值?
How to filter data by group and remove values if a condition is given in R?
问:
我想在 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)))
先谢谢你,
答:
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)
评论
outer
rowSums
3e-90
3e-10