【问题标题】:Add minimum value as a new column using mutate [duplicate]使用 mutate [重复] 将最小值添加为新列
【发布时间】:2026-02-10 07:40:02
【问题描述】:

我在 R 中有以下数据框

library(dplyr)
library(tidyr)### IMPORTED LIBRARIES
DF<-data.frame("Index"=c(1,2,3,4,5,6,7,8,9,10))
DF$CI=c("A1", "A2", "A3", "A4", 'A1', "A6", "A7", "A8", "A9", "A9")

数据框由两列组成,一列是序列号从 1 到 10 的索引列,另一列是 CI。 CI 列中的值可能是唯一的或重复的。数据框如下所示

   Index CI
1      1 A1
2      2 A2
3      3 A3
4      4 A4
5      5 A1
6      6 A6
7      7 A7
8      8 A8
9      9 A9
10    10 A9

我想添加一列 EI,指示正确的索引值,以防 CI 中的值重复。预期输出如下

    Index CI EI
 1      1 A1  1
 2      2 A2  2
 3      3 A3  3
 4      4 A4  4
 5      5 A1  1
 6      6 A6  6
 7      7 A7  7
 8      8 A8  8
 9      9 A9  9
 10    10 A9  9

EI 列应显示与 CI 列中的条目对应的相应索引值。在重复的情况下,返回的值应该是最小索引值。我已经使用 DPLYR 尝试了以下代码

  DF%>%mutate(EI=case_when(CI==unique(CI)~min(Index)))

我得到以下输出。

    Index CI EI
 1      1 A1  1
 2      2 A2  1
 3      3 A3  1
 4      4 A4  1
 5      5 A1 NA
 6      6 A6 NA
 7      7 A7 NA
 8      8 A8 NA
 9      9 A9 NA
 10    10 A9 NA

我也试过这段代码,但没有得到想要的输出

    DF%>%mutate(EI=min(Index))

输出

      Index CI EI
   1      1 A1  1
   2      2 A2  1
   3      3 A3  1
   4      4 A4  1
   5      5 A1  1
   6      6 A6  1
   7      7 A7  1
   8      8 A8  1
   9      9 A9  1
   10    10 A9  1

我在这里请求一些帮助。我正在使用 DPLYR,因为数据集很大(我给出了一个玩具数据集)并且循环需要很长时间。

【问题讨论】:

  • DF %&gt;% mutate(EI = group_indices(., CI)) 或者您正在寻找DF %&gt;% group_by(CI) %&gt;% mutate(EI = min(Index))
  • 替代:DF %&gt;% mutate(EI = match(CI, CI))
  • @RonakShah 还有EI = first(Index),而不是min(Index)
  • @Rui Barradas first(Index) 与 min(Index) 有何不同

标签: r tidyr dplyr


【解决方案1】:

您希望Index 的最小值在CI 的匹配值范围内。这就是group_by() 的用途:

DF %>%
    group_by(CI) %>%
    mutate(EI = min(Index))

【讨论】:

  • 好的。这就解释了。分组后,CI==CI 是多余的。谢谢