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