假设我在p
中存储了以下内容
los tti ID
1 1.002083333 23.516667 84
2 -0.007638889 2.633333 118
3 0.036805556 2.633333 118
4 0.134722222 2.716667 120
5 2.756250000 82.800000 132
6 1.066666667 17.933333 156
7 -2.496250000 12.830948 156
我希望filter
输出p$los
具有负值的行,但前提是p$tti
和p$ID
在行之间重复。例如,行2
和3
在p$tti
和p$ID
上都是重复的,因此,由于p$los
中的负值,应该省略行2。关于p$ID
,行6
和7
是重复的,而不是p$tti
,因此应该保留。
我正在寻找dplyr
的解决方案
p <- structure(list(los = c(1.00208333333333, -0.00763888888888889,
0.0368055555555556, 0.134722222222222, 2.75625, 1.06666666666667,
-0.00763888888888889, 4.84305555555556, 1.79375, 8.55694444444444
), tti = c(23.5166666666667, 2.63333333333333, 2.63333333333333,
2.71666666666667, 82.8, 17.9333333333333, 1.31666666666667, 69.2666666666667,
52.9833333333333, 36.0166666666667), ID = c(84L, 118L, 118L,
120L, 132L, 156L, 179L, 245L, 253L, 334L)), row.names = c(NA,
10L), class = "data.frame")
根据您的度量,作为数据处理的一部分,您可能需要将tti
列(数字小数(四舍五入到某个公差级别(例如,小数点后3位(。
使用dplyr
,您可以尝试以下操作:
p %>%
group_by(tti, ID) %>%
filter(n() == 1 | los >= 0)
这将通过tti
和ID
(组的n() == 1)
(过滤/保留不存在重复的行,然后如果存在重复,则保留los
为正或零(非负(的行。
输出
los tti ID
<dbl> <dbl> <int>
1 1.00 23.5 84
2 0.0368 2.63 118
3 0.135 2.72 120
4 2.76 82.8 132
5 1.07 17.9 156
6 -0.00764 1.32 179
7 4.84 69.3 245
8 1.79 53.0 253
9 8.56 36.0 334
如果我正确理解
library(tidyverse)
df <- read.table(text = " los tti ID
1 1.002083333 23.516667 84
2 -0.007638889 2.633333 118
3 0.036805556 2.633333 118
4 0.134722222 2.716667 120
5 2.756250000 82.800000 132
6 1.066666667 17.933333 156
7 -2.496250000 12.830948 156", header = T)
df %>%
group_by(ID) %>%
filter((sd(tti, na.rm = T) + los) > 0 | is.na(sd(tti, na.rm = T))) %>%
ungroup()
#> # A tibble: 6 x 3
#> los tti ID
#> <dbl> <dbl> <int>
#> 1 1.00 23.5 84
#> 2 0.0368 2.63 118
#> 3 0.135 2.72 120
#> 4 2.76 82.8 132
#> 5 1.07 17.9 156
#> 6 -2.50 12.8 156
由reprex软件包(v1.0.0(于2021-03-15创建