我有以下数据集,其中包含id
,sex
和数字变量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)=10
和max(xvar)=12
。此外,1.05*10 < 12
......然后
删除id
的记录。
另一个例子是当id
为5时。min(xvar)=11
,max(xvar)=11.1
和1.05*11 > 11.1
。保留id
为5的记录。
答案 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
也必须是一个.SD
。 list
是什么?它是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创建“块”数据以便一次迭代,然后将过滤器代码依次应用于每个块。