考虑这个玩具数据框架。我想创建一个新的数据框,其中只有低于'#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)
答案 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