我有一个数据框,看起来像这样:

tt1 <- structure(list(sjlid = c("SJL1527107", "SJL1527107", "SJL1527107", 
"SJL1527107", "SJL1527107"), condition = c("Abnormal_glucose_metabolism", 
"Abnormal_glucose_metabolism", "Abnormal_glucose_metabolism", 
"Abnormal_glucose_metabolism", "Abnormal_glucose_metabolism"), 
    grade = c(NA, NA, NA, NA, NA), ageevent = c(58.8352421588442, 
    62.1366120218579, 64.4872969533648, 68.9694887341867, 70.9612695561045
    )), row.names = 72:76, class = "data.frame")

我需要运行以下代码:

library(dplyr)
tt1 %>% group_by(condition) %>% top_n(1, grade) %>% top_n(1, ageevent)

当有多行(如tt1)时,该代码可以工作,但如果只有一行(如下面的tt2),它就无法给出特定的行.例如,如果我的数据框是这样的:

tt2 <- structure(list(sjlid = "SJL1527107", condition = "Abnormal_glucose_metabolism", 
    grade = NA, ageevent = 58.8352421588442), row.names = 72L, class = "data.frame")

tt2 %>% group_by(condition) %>% top_n(1, grade) %>% top_n(1, ageevent)一无所获

# A tibble: 0 x 4
# Groups:   condition [0]
# ... with 4 variables: sjlid <chr>, condition <chr>, grade <lgl>, ageevent <dbl>

相反,我希望它返回这一行,因为这是唯一一行.

        sjlid                   condition grade         ageevent
72 SJL1527107 Abnormal_glucose_metabolism    NA 58.8352421588442

推荐答案

slice_max可以使用——top_n有点不赞成使用slice

library(dplyr)
tt1 %>% 
  group_by(condition) %>%
  slice_max(n = 1, order_by = ageevent) %>%
  ungroup

-输出

# A tibble: 1 × 4
  sjlid      condition                   grade ageevent
  <chr>      <chr>                       <lgl>    <dbl>
1 SJL1527107 Abnormal_glucose_metabolism NA        71.0

它也适用于tt2(如果需要考虑两个列)

tt2 %>%
  group_by(condition) %>% 
  slice_max(n = 1, order_by = pmax(ageevent, grade, na.rm = TRUE) ) %>%
  ungroup
# A tibble: 1 × 4
  sjlid      condition                   grade ageevent
  <chr>      <chr>                       <lgl>    <dbl>
1 SJL1527107 Abnormal_glucose_metabolism NA        58.8

如果我们需要优先考虑,一个选项也是arrange

tt2 %>%
   arrange(condition, desc(ageevent), desc(grade)) %>% 
   distinct(condition, .keep_all = TRUE)

对于top_n人,我们可以使用

tt2 %>%
   group_by(condition) %>%
   top_n(pmax(grade, ageevent, na.rm = TRUE)) %>%
   ungroup
Selecting by ageevent
# A tibble: 1 × 4
  sjlid      condition                   grade ageevent
  <chr>      <chr>                       <lgl>    <dbl>
1 SJL1527107 Abnormal_glucose_metabolism NA        58.8

R相关问答推荐

过滤器数据.基于两列的帧行和R中的外部向量

警告:lmdif:info = 0. nls. lm()函数的输入参数不正确

格点中指数、双曲和反双曲模型曲线的正确绘制

在某些栏和某些条件下,替换dfs列表中的NA

在R中,如何将变量(A,B和C)拟合在同一列中,如A和B,以及A和C在同一面板中?

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

在rpart. plot或fancyRpartPlot中使用带有下标的希腊字母作为标签?

列名具有特殊字符时的循环回归

如何在PDF格式的kableExtra表格中显示管道字符?

如何移除GGPlot中超出与面相交的任何格网像元

当每个变量值只能 Select 一次时,如何从数据框中 Select 两个变量的组合?

按组跨多列创建伪变量

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内

如何在矩阵图中按标准对数据进行分组以绘制矩阵

使用显式二元谓词子集化sfc对象时出错

我有2011-2022年的年度数据.如何计算最低年份和最高年份之间的差额?

使用nls()函数的非线性模型的半正态图

用从先前非NA值开始的递增序列替换NA值

如何 suppress 条形图中的零条?

线性混合模型方差分析的非参数方法及幂计算