首页 > 解决方案 > 使用特定标准在 R 中保留一行并丢弃其他行?

问题描述

我正在使用下面的数据框,它只是完整数据的一部分,我需要将 id 列中的重复数字压缩成一行。我想保留具有最高 sbp 编号的行,除非它是 300 或更大,在这种情况下我也想丢弃它。

例如,对于 id 为 13480 的前三行,我想保留 124 的行并丢弃另外两行。

id,sex,visits,sbp    
13480,M,2,124
13480,M,3,306
13480,M,4,116
13520,M,2,124
13520,M,3,116
13520,M,4,120
13580,M,2,NA
13580,M,3,124

这是我得到的最远的地方,一直在尝试调整它,但不确定我是否走在正确的轨道上:

maxsbp <- split(sbp, sbp$sbp)
  r <- data.frame()
  for (i in 1:length(maxsbp)){
    one <- maxsbp[[i]]
    index <- which(one$sbp == max(one$sbp))
    select <- one[index,]
    r <- rbind(r, select) 
}
  r1 <- r[!(sbp$sbp>=300),]
  r1

标签: rdatabase

解决方案


我认为一个整洁的解决方案会很好地工作。如果您不想保留任何高于该阈值的值,我将首先过滤所有高于 300 的值。然后group_by id,order,并保持第一个。

my.df <- data.frame("id" = c(13480,13480,13480,13520,13520,13520,13580,13580),
                       "sex" = c("M","M","M","M","M","M","M","M"),
                       "sbp"= c(124,306,116,124,116,120,NA,124))
my.df %>% filter(sbp < 300) # filter to retain only values below 300
      %>% group_by(id) # group by id
      %>% arrange(-sbp) # arrange by id in descending order
      %>% top_n(1, sbp) # retain first value i.e. the largest

# A tibble: 3 x 3
# Groups:   id [3]
#     id sex     sbp
#  <dbl> <chr> <dbl>
#1 13480 M       124
#2 13520 M       124
#3 13580 M       124

推荐阅读