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

时间:2017-04-25 13:41:54

标签: r duplicates

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

我希望能够删除ID重复的行,但以age_months为条件,以便将最接近的age_months留给预先指定的数字。

希望这有意义,但也提供一个例子......

在这里,我想选择最接近96个月的年龄,当个人有多个条目时 - 因此要删除第1行和第2行,其中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

3 个答案:

答案 0 :(得分:0)

当两行具有相同的绝对年龄差异时,您需要考虑条件。如果发生这种情况,你想保留哪一个?这里的解决方案不考虑这一点。

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)

更新

如果要为不同的ID指定不同的目标年龄,可以先创建一个存储信息的数据框,然后使用left_join合并该表。

# Set target age for each ID
taget_age_df <- data_frame(ID = c("P0001", "P0002", "P0003", "P0004", "P0005"),
                           Target_Age = c(86, 88, 96, 100, 82))

# Subset the data
dat2 <- dat %>%
  left_join(taget_age_df, by = "ID") %>%
  mutate(AGE_Diff = abs(AGE_MONTHS - Target_Age)) %>%
  arrange(ID, AGE_Diff) %>%
  group_by(ID) %>%
  slice(1) %>%
  select(-AGE_Diff, -Target_Age)

答案 1 :(得分:0)

假设您的数据被称为&#39; dat&#39;和&#39; dff&#39;是不同的。

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)))] )),]

答案 2 :(得分:0)

假设每age

有一个最低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)
)

然后

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)