【问题标题】:Manipulate the first row for an individual in R在 R 中为个人操作第一行
【发布时间】:2022-01-03 08:07:36
【问题描述】:

假设一个人在一个数据框中有多个条目(行)。例如;

rm(list=ls()); set.seed(1234); n<-3 ; 
individualID<-rep(1:3, rep(3,3) )
X<- runif(n*3, 1, 4)
Y<- rep( runif(n,1,4), rep(3,3)  )
df1<-round(data.frame(individualID,X,Y),3)
df1
 individualID     X     Y
1            1 3.512 1.656
2            1 1.859 1.656
3            1 1.800 1.656
4            2 1.560 3.432
5            2 1.697 3.432
6            2 1.950 3.432
7            3 1.908 2.577
8            3 1.477 2.577
9            3 1.120 2.577

我想只为每个人操作第一行,如下所示,使 df1$X 等于 df1$Y,但其余行保留。

我应该结束

 individualID     X     Y
1            1 1.656 1.656
2            1 1.859 1.656
3            1 1.800 1.656
4            2 3.432 3.432
5            2 1.697 3.432
6            2 1.950 3.432
7            3 2.577 2.577
8            3 1.477 2.577
9            3 1.120 2.577

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    你可以试试

    library(dplyr)
    
    df1 %>%
      group_by(individualID) %>%
      mutate(n = 1:n()) %>%
      mutate(X = ifelse(n == 1, Y, X)) %>%
      select(-n)
    
      individualID     X     Y
             <int> <dbl> <dbl>
    1            1  1.66  1.66
    2            1  1.86  1.66
    3            1  1.8   1.66
    4            2  3.43  3.43
    5            2  1.70  3.43
    6            2  1.95  3.43
    7            3  2.58  2.58
    8            3  1.48  2.58
    9            3  1.12  2.58
    

    【讨论】:

      【解决方案2】:

      您可以使用row_number() 按组对行进行编号。

      library(dplyr)
      
      df1 %>% 
        group_by(individualID) %>% 
        mutate(X = ifelse(row_number() == 1, Y, X)) %>% 
        ungroup()
      

      由于某种原因,我得到了与您的 df1 不同的值,但结果是:

      # A tibble: 9 × 3
        individualID     X     Y
               <dbl> <dbl> <dbl>
      1            1  2.54  2.54
      2            1  2.87  2.54
      3            1  2.83  2.54
      4            2  3.08  3.08
      5            2  3.58  3.08
      6            2  2.92  3.08
      7            3  2.64  2.64
      8            3  1.70  2.64
      9            3  3.00  2.64
      

      【讨论】:

        【解决方案3】:

        另一种方法是 -

        library(dplyr)
        
        df1 %>%
          group_by(individualID) %>%
          mutate(X = c(Y[1], X[-1])) %>%
          ungroup
        
        #  individualID     X     Y
        #         <int> <dbl> <dbl>
        #1            1  1.66  1.66
        #2            1  1.86  1.66
        #3            1  1.8   1.66
        #4            2  3.43  3.43
        #5            2  1.70  3.43
        #6            2  1.95  3.43
        #7            3  2.58  2.58
        #8            3  1.48  2.58
        #9            3  1.12  2.58
        

        【讨论】:

          猜你喜欢
          • 2022-12-06
          • 2020-01-24
          • 2022-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多