在R中:跨变量使用多个条件删除

在R中:跨变量使用多个条件删除,r,R,我想删除这些观察(由companyID进行),其中组为1,一年有两次观察(其中一次观察涉及B型,另一次涉及K型)。通过我下面的例子可能更容易理解 以下是我拥有的数据集示例: companyID type group year 1 B 1 2006 1 K 1 2006 1 B 1 2007 2 B 1 2001 2 B

我想删除这些观察(由companyID进行),其中组为1,一年有两次观察(其中一次观察涉及B型,另一次涉及K型)。通过我下面的例子可能更容易理解

以下是我拥有的数据集示例:

companyID  type  group  year
    1       B      1    2006
    1       K      1    2006
    1       B      1    2007
    2       B      1    2001
    2       B      1    2002
    2       K      1    2002
    2       K      2    2003
    3       B      1    2010
    3       K      1    2010
    3       K      2    2011
这是我喜欢的结果:

companyID  type  group  year
    1       B      1    2007
    2       B      1    2001
    2       K      2    2003
    3       K      2    2011

谢谢

将此代码/语法用于
tidyverse

library(dplyr)

df %>% group_by(companyID, year) %>%
  filter(n() == 1 , n_distinct(type) == 1)

# A tibble: 4 x 4
# Groups:   companyID, year [4]
  companyID type  group  year
      <int> <chr> <int> <int>
1         1 B         1  2007
2         2 B         1  2001
3         2 K         2  2003
4         3 K         2  2011
卑鄙的方式

subset(df, as.numeric(ave(df$type, paste(df$companyID, df$year),  FUN = length)) == 1)

   companyID type group year
3          1    B     1 2007
4          2    B     1 2001
7          2    K     2 2003
10         3    K     2 2011

基本溶液

do.call(
  rbind,
  by(df,list(df$companyID,df$group,df$year),function(x){
    if ((nrow(x)!=2 & x$group[1]==1) | x$group[1]!=1) {
      x
    }
  })
)

   companyID type group year
4          2    B     1 2001
7          2    K     2 2003
3          1    B     1 2007
10         3    K     2 2011

数据表
解决方案:

library(data.table)

dat = fread('companyID  type  group  year
    1       B      1    2006
    1       K      1    2006
    1       B      1    2007
    2       B      1    2001
    2       B      1    2002
    2       K      1    2002
    2       K      2    2003
    3       B      1    2010
    3       K      1    2010
    3       K      2    2011')

result = dat[, types:= uniqueN(type), by = .(companyID, group, year)][group != 1 | types == 1][, types:= NULL]

> result
   companyID type group year
1:         1    B     1 2007
2:         2    B     1 2001
3:         2    K     2 2003
4:         3    K     2 2011

在我看来,您只需按
分组
年份
分组即可

df %>% group_by(group, year) %>% filter(n() < 2)
df%>%groupby(group,year)%>%filter(n()<2)
输出:

#   companyID type  group  year
#       <dbl> <chr> <dbl> <dbl>
# 1         1 B         1  2007
# 2         2 B         1  2001
# 3         2 K         2  2003
# 4         3 K         2  2011
#公司ID类型集团年度
#          
#1b12007
#2 B 1 2001
#3 2 K 2 2003
#43K2011
df %>% group_by(group, year) %>% filter(n() < 2)
#   companyID type  group  year
#       <dbl> <chr> <dbl> <dbl>
# 1         1 B         1  2007
# 2         2 B         1  2001
# 3         2 K         2  2003
# 4         3 K         2  2011