我在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
答案 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)