Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R、 有条件地删除重复行-基于最接近特定值_R_Duplicates - Fatal编程技术网

R、 有条件地删除重复行-基于最接近特定值

R、 有条件地删除重复行-基于最接近特定值,r,duplicates,R,Duplicates,我在R中有一个数据框,包含ID、Sex、Height和Age\u Months列。对于每个ID,可能有多个不同年龄段的身高条目(即ID中可能有多个重复行,例如所有值P0001,每个值在该行中具有不同的身高和年龄) 我希望能够删除ID重复的行,但要以年龄月数为条件,这样我的年龄月数与预先指定的数字最接近 希望这是有意义的,但也提供了一个例子 在这里,我想选择最接近96个月的年龄,当一个人有多个条目时——因此删除ID=P0003的第一行和第二行 ID, SEX, HEIGHT, AGE_MONTHS

我在R中有一个数据框,包含ID、Sex、Height和Age\u Months列。对于每个ID,可能有多个不同年龄段的身高条目(即ID中可能有多个重复行,例如所有值P0001,每个值在该行中具有不同的身高和年龄)

我希望能够删除ID重复的行,但要以年龄月数为条件,这样我的年龄月数与预先指定的数字最接近

希望这是有意义的,但也提供了一个例子

在这里,我想选择最接近96个月的年龄,当一个人有多个条目时——因此删除ID=P0003的第一行和第二行

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)