使用mutate将最小值添加为新列

时间:2019-08-02 06:07:28

标签: r dplyr tidyr mutate

我在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")

数据帧由两列组成,索引列的序列号从一到十,第二列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

如果CI中的值重复,我想添加一列EI来指示正确的Index值。预期输出如下

    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,因为数据集很大(我已经给出了一个玩具数据集),并且循环耗时很长。

1 个答案:

答案 0 :(得分:2)

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

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