我试图获取在某一列中具有某些值但在另一列中具有正值和负值的行。输入是下面的数据框
double
输出看起来像这样
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)
)
我在寻找this link,但不是我要找的东西。
答案 0 :(得分:3)
按“ 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)))
答案 1 :(得分:0)
在基数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))