Nic*_*cko 3 r filter dataframe
假设这个数据框:
country <- c('USA', 'USA', 'USA', 'USA', 'USA', 'UK', 'UK', 'UK', 'Canada')
number <- c(1:9)
df <- data.frame(country, number)
Run Code Online (Sandbox Code Playgroud)
我希望能够仅对国家计数大于 4 或小于 2 的行进行子集化。因此,在这种情况下,它将返回:
country number
USA 1
USA 2
USA 3
USA 4
USA 5
Canada 9
Run Code Online (Sandbox Code Playgroud)
我能够使它与这个一起工作:
totalcounts <- filter(count(df, country), n>4 | n<2) # giving me a df of the country and count
for (i in nrow(totalcounts)){
# code in here that rbinds rows as it matches
}
Run Code Online (Sandbox Code Playgroud)
但我觉得必须有一个更简单的方法。我还没有掌握 sapply 之类的东西,所以我觉得我在这里错过了一些东西。似乎我要走了很长一段路,并且已经有一些东西可以做到这一点。
这是使用subset+的基本 R 选项ave
subset(df,!ave(number,country,FUN = function(x) length(x)%in% c(2:4)))
Run Code Online (Sandbox Code Playgroud)
或更短的版本(感谢@Onyambu)
subset(df,!ave(number,country,FUN = length) %in% 2:4)
Run Code Online (Sandbox Code Playgroud)
以至于
country number
1 USA 1
2 USA 2
3 USA 3
4 USA 4
5 USA 5
9 Canada 9
Run Code Online (Sandbox Code Playgroud)