我正在处理一个数据框(在R中),其中包含野外动物的观察结果(记录时间/日期,位置和物种识别)。我想删除包含某个物种的行,如果整个数据帧中的行数少于x。截至目前,我设法使用以下代码,但我知道必须有一种更优雅,更有效的方法。
namelist <- names(table(ind.data$Species))
for (i in 1:length(namelist)) {
if (table(ind.data$Species)[namelist[i]] <= 2) {
while (namelist[i] %in% ind.data$Species) {
j <- match(namelist[i], ind.data$Species)
ind.data <- ind.data[-j,]
}
}
}
namelist
向量包含数据框ind.data
中的所有物种名称,if
语句检查i
名称的频率是否为2
list小于x(在此示例中为function getMaxProfit(stock_prices){
var current_price = stock_prices[0];
var min_price = current_price
var max_profit = 0
var current_profit = 0
for (var i = 0; i < stock_prices.length; i++){
current_price = stock_prices[i];
if (current_price > min_price){
current_profit = current_price - min_price
if (current_profit > max_profit){
max_profit = current_profit
}
}
else
{
min_price = current_price;
}
}
return max_profit
}
)。
我完全清楚这不是一个非常干净的方法,我只是在昨天结束时把它扔在一起,看它是否会起作用。现在我正在寻找一种更好的方法,或者至少我可以如何改进它。
答案 0 :(得分:1)
您可以使用dplyr包执行此操作:
library(dplyr)
new.ind.data <- ind.data %>%
group_by(Species) %>%
filter(n() > 2) %>%
ungroup()
使用内置函数的替代方法是使用ave()
:
group_sizes <- ave(ind.data$Species, ind.data$Species, FUN = length)
new.ind.data <- ind.data[group_sizes > 2, ]
答案 1 :(得分:0)
我们可以使用data.table
library(data.table)
setDT(ind.data)[, .SD[.N >2], Species]