首页 > 解决方案 > 如何提取具有正值和负值的相同行

问题描述

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

 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

我在看这个链接,但不是我要找的。

标签: rdataframesubset

解决方案


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

推荐阅读