如何提取具有正值和负值的相同行

时间:2019-07-23 20:47:19

标签: r dataframe subset

我试图获取在某一列中具有某些值但在另一列中具有正值和负值的行。输入是下面的数据框

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,但不是我要找的东西。

2 个答案:

答案 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 Rave一起使用

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))