如何根据与列的平均值和另一列的最大值的距离来删除行

时间:2015-08-18 13:40:29

标签: r dataframe

考虑这个玩具数据框架。我想创建一个新的数据框,其中只有低于'#34; bird"的平均值的行。并且只有少于两个顶部值的行在" wolfs"的最大值之后。在这个数据框中我只得到行:543,608,987,225,988,556。 我将这两行代码用于第一个约束,但无法找到第二个约束的解决方案。

df$filt<-ifelse(df$birds<mean(df$birds),1,0)
 df1<-df1[which(df1$filt==1),]

如何创建第二个约束? 这是玩具数据框:

df <- read.table(text = "userid target birds    wolfs     
                222              1        9         7 
                444              1        8         4 
                234              0        2         8 
                543              1        2         3 
                678              1        8         3 
                987              0        1         2 
                294              1        7         1 
                608              0        1         5 
                123              1        9         7 
                321              1        8         7 
                226              0        2         7 
                556              0        2         3 
                334              1        6         3 
                225              0        1         1 
                999              0        3         9 
                988              0        1         1  ",header = TRUE)

2 个答案:

答案 0 :(得分:2)

这里有一个解决方案,但也许有些约束对我来说并不清楚,因为它符合您想要的输出的另一行。

avbi <- mean(df$birds)
ttw <- sort(df$wolfs, decreasing = T)[3]

df[df$birds < avbi & df$wolfs < ttw , ]
userid target birds wolfs
4     543      1     2     3
6     987      0     1     2
8     608      0     1     5
12    556      0     2     3
14    225      0     1     1
16    988      0     1     1

dplyr

df %>% filter(birds < avbi & wolfs < ttw)

答案 1 :(得分:2)

subset(df,birds < mean(birds) & wolfs < sort(unique(wolfs),decreasing=T)[3]);
##    userid target birds wolfs
## 4     543      1     2     3
## 6     987      0     1     2
## 8     608      0     1     5
## 12    556      0     2     3
## 14    225      0     1     1
## 16    988      0     1     1