根据规则选择或删除重复记录

时间:2015-11-17 15:02:58

标签: r

我有以下数据集,其中包含idsex和数字变量xvar

id <- c(1,1,1,1,2,2,3,3,4,4,4,5,5)
sex <- c(1,1,1,1,2,2,2,2,1,1,1,2,2)
xvar <- c(10,11,10,12,9,9.1,10,10.4,3,2.9,4,11,11.1)
df <- data.frame(id,sex,xvar)

对于每个id,我想检查xvar的最小值和最大值。如果1.05*min(xvar) >= max(xvar)那么我需要保留记录。否则,删除它们。

例如,如果id为1,min(xvar)=10max(xvar)=12。此外,1.05*10 < 12 ......然后 删除id的记录。

另一个例子是当id为5时。min(xvar)=11max(xvar)=11.11.05*11 > 11.1。保留id为5的记录。

2 个答案:

答案 0 :(得分:3)

这可以使用notifyUrl完成:

data.table

library(data.table) setDT(df) output <- df[ , if (1.05 * min(xvar) >= max(xvar)) .SD, by = id] (无形)将表格划分为一组by = id length(unique(id)),每个值data.tables一个;在这些内容中,只有满足您的条件,我们才会找到id的范围并返回整个表格(即xvar)。

有关.SD的更多信息:

首先,请注意.SD参数中的.SD,通常是j列或涉及列的表达式列表,因此list也必须是一个.SDlist是什么?它是list所有列的list

(有关更高级的用法,请参阅data.table,例如?data.table参数,该参数允许我们指定由.SDcols表示的列的子集

答案 1 :(得分:2)

您也可以在dplyr中执行此操作:

library(dplyr)
df2 <- df%>%
  group_by(id)%>%
  dplyr::filter(1.05*min(xvar)>=max(xvar))

group_by创建“块”数据以便一次迭代,然后将过滤器代码依次应用于每个块。