根据变量

时间:2017-05-19 15:57:20

标签: r dataframe

我正在处理一个数据框(在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 } )。

我完全清楚这不是一个非常干净的方法,我只是在昨天结束时把它扔在一起,看它是否会起作用。现在我正在寻找一种更好的方法,或者至少我可以如何改进它。

2 个答案:

答案 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]