R语言 筛选具有正值和适当负值的行

zyfwsgd6  于 2023-05-26  发布在  其他
关注(0)|答案(3)|浏览(272)

在R中,我想用列“first”的group_by过滤“second”中有正值和“second”中有适当负值的行。因此,在前两行和后两行下面的情况下。

# creating first column
first <- c(1,2,3,4,5,6,7,1,1,2)
# creating second column
second <- c(88,52,-28,-19,39,86,-31,10,-88,-52)
df<-data.frame(first, second)

结果应为

data.frame(first=c(1,2,1,2), second=c(88,52,-88,-52))
xriantvc

xriantvc1#

您可以在ave中将%in%intersect一起使用。

df[ave(df$second, df$first, FUN=\(x) x %in% intersect(x, -x)) == 1,]
#   first second
#1      1     88
#2      2     52
#9      1    -88
#10     2    -52
vd2z7a6w

vd2z7a6w2#

首先创建一个表示second绝对值的列,然后创建group_byfirstabs列。filter,对于正好有两个条目的组,其中一个为正,另一个为负。

library(dplyr)

df %>% 
  mutate(abs = abs(second)) %>% 
  group_by(first, abs) %>% 
  filter(n() == 2 & (sum(second > 0) == 1 & sum(second < 0) == 1)) %>% 
  ungroup()

# A tibble: 4 × 3
  first second   abs
  <dbl>  <dbl> <dbl>
1     1     88    88
2     2     52    52
3     1    -88    88
4     2    -52    52
r6vfmomb

r6vfmomb3#

也许这个能帮上忙

df %>%
    group_by(first, abs_second = abs(second)) %>%
    filter(n() == 2, sum(second) == 0) %>%
    ungroup() %>% 
    select(-abs_second)

它给出了

# A tibble: 4 × 2
  first second
  <dbl>  <dbl>
1     1     88
2     2     52
3     1    -88
4     2    -52

相关问题