R、 有条件地删除重复行-基于最接近特定值
我在R中有一个数据框,包含ID、Sex、Height和Age\u Months列。对于每个ID,可能有多个不同年龄段的身高条目(即ID中可能有多个重复行,例如所有值P0001,每个值在该行中具有不同的身高和年龄) 我希望能够删除ID重复的行,但要以年龄月数为条件,这样我的年龄月数与预先指定的数字最接近 希望这是有意义的,但也提供了一个例子 在这里,我想选择最接近96个月的年龄,当一个人有多个条目时——因此删除ID=P0003的第一行和第二行R、 有条件地删除重复行-基于最接近特定值,r,duplicates,R,Duplicates,我在R中有一个数据框,包含ID、Sex、Height和Age\u Months列。对于每个ID,可能有多个不同年龄段的身高条目(即ID中可能有多个重复行,例如所有值P0001,每个值在该行中具有不同的身高和年龄) 我希望能够删除ID重复的行,但要以年龄月数为条件,这样我的年龄月数与预先指定的数字最接近 希望这是有意义的,但也提供了一个例子 在这里,我想选择最接近96个月的年龄,当一个人有多个条目时——因此删除ID=P0003的第一行和第二行 ID, SEX, HEIGHT, AGE_MONTHS
ID, SEX, HEIGHT, AGE_MONTHS
P0001 1 120.5 87
P0002 0 129.6 84
P0003 1 150.8 103
P0003 1 139.5 99
P0003 1 126.2 97
P0004 0 168.4 101
P0005 0 117.1 82
您需要考虑两行具有相同绝对年龄差异的情况。如果发生这种情况,你想保留哪一个?这里的解决方案没有考虑到。
library(data.table)
library(dplyr)
# Create example data frame
dat <- fread("ID SEX HEIGHT AGE_MONTHS
P0001 1 120.5 87
P0002 0 129.6 84
P0003 1 150.8 103
P0003 1 139.5 99
P0003 1 126.2 97
P0004 0 168.4 101
P0005 0 117.1 82")
# Set target age
target_age <- 96
# Subset the data
dat2 <- dat %>%
mutate(AGE_Diff = abs(AGE_MONTHS - target_age)) %>%
arrange(ID, AGE_Diff) %>%
group_by(ID) %>%
slice(1) %>%
select(-AGE_Diff)
假设您的数据称为“dat”,而“dff”则是差异
library(data.table)
dat=as.data.table(dat)
dff=86
dat[unique(sapply(with(dat,sapply(ID,function(x)which(x==ID))),function(x) x[which((dat$Age[x]-dff) == min((dat$Age[x]-dff)))] )),]
假设每个
id
创建示例数据表
library(data.table)
dt <- data.table(
id=c("P001","P003","P003","P003","P004"),
age=c(90,95,98,99,100),
sex=c(1,0,1,1),
height=c(120.5,160.2,180.4,190.3)
)
库(data.table)
dt
library(data.table)
dt <- data.table(
id=c("P001","P003","P003","P003","P004"),
age=c(90,95,98,99,100),
sex=c(1,0,1,1),
height=c(120.5,160.2,180.4,190.3)
)
for (i in dt$id)
{
min_age <- dt[id==i,min(age)]
height_to_keep <- dt[id==i & age==min_age,height]
sex_to_keep <- dt[id==i & age==min_age,sex]
dt[id==i,age:=min_age]
dt[id==i,sex:=sex_to_keep]
dt[id==i,height:=height_to_keep]
}
dt <- unique(dt)