我正在尝试获取行,这些行在一列中有一些值,而在另一列中有正和负值。输入是下面的数据框架
data <- data.frame(X = c(1,3,5,7,7,8,9,10,10,11,11,12,12),
Y = sample(36476545:36476557),
timepoint = c(0,1,0,-0.31,1,1,1,1,-1,1,1,1,1)
)输出如下所示
X Y timepoint
4 7 36476557 -0.31
5 7 36476545 1.00
8 10 36476556 1.00
9 10 36476548 -1.00我在看this link,但不是我要找的东西。
发布于 2019-07-23 20:49:34
在按“X”进行分组后,将具有负数和正时点的filter取“时间点”的sign,得到不同的元素数(n_distinct)为2(假设没有零)
library(dplyr)
data %>%
group_by(X) %>%
filter(n_distinct(sign(timepoint)) == 2)
# A tibble: 4 x 3
# Groups: X [2]
# X Y timepoint
# <dbl> <int> <dbl>
#1 7 36476547 -0.31
#2 7 36476556 1
#3 10 36476549 1
#4 10 36476557 -1 注意:'Y‘值是不同的,因为示例创建时没有set.seed
如果也有零
data %>%
group_by(X) %>%
filter(all(c(-1, -1) %in% sign(timepoint)))或者将base R与ave结合使用
data[with(data, ave(sign(timepoint), X, FUN = function(x) length(unique(x))) == 2),]或另一个带有base R的table选项
subset(data, X %in% names(which(rowSums(with(subset(data,
timepoint != 0), table(X, sign(timepoint))) > 0) == 2)))发布于 2019-07-24 01:28:25
在基R中,我们可以使用ave并选择至少有一个大于0的timepoint值和一个小于0的timepoint值的组。
data[with(data, ave(timepoint > 0, X, FUN = function(x) any(x) & any(!x))), ]
# X Y timepoint
#4 7 36476553 -0.31
#5 7 36476551 1.00
#8 10 36476556 1.00
#9 10 36476554 -1.00在dplyr中,这将是
library(dplyr)
data %>%
group_by(X) %>%
filter(any(timepoint > 0) & any(timepoint < 0))https://stackoverflow.com/questions/57171967
复制相似问题