【问题标题】:Creating a new variable based on the orders of existing variables using R使用 R 根据现有变量的顺序创建新变量
【发布时间】:2019-03-17 00:29:07
【问题描述】:

希望基于三个现有变量创建新变量 X:“SubID”“Day”和“Time”。我曾经在 excel 中有三个排序功能来手动执行此操作:首先按“SubID”排序,然后按“Day”排序,最后按“Time”排序。 X 应该是从 1 到每个 SubID 的最大行数,基于日期和时间的顺序。

SubID:分配的主题编号

Day:每个受试者的天数(1,2,3...21)

时间:1、2、3

X:标记为相同SubID的行数

SubID Day  Time   X    
 1    1     1     1
 1    1     2     2
 1    1     3     3
 1    2     1     4
 1    2     2     5
 2    1     1     1
 2    1     2     2
 2    1     3     3
 2    2     3     6
 2    2     2     5
 2    2     1     4

我一直在 excel 中手动执行此操作,我确信在 R 中必须有更智能的方法来执行此操作,但我是 R 新手,不知道如何操作。提前谢谢!

【问题讨论】:

    标签: r variables time-series


    【解决方案1】:

    可能与 data.table 包一起使用。如果您还没有安装它,您将不得不安装它。我已经对命令进行了注释。

    # install.packages("data.table")
    library(data.table)
    

    我们可以通过以下方式生成您的数据。

    df <- data.frame(SubId=sample(1:2,10,replace=TRUE),
                     Day=sample(1:2,10,replace=TRUE),
                         Time=sample(1:2,10,replace=TRUE))
    

    然后将data.frame转换成data.table。

    setDT(df)
    ##> df
    ##     SubId Day Time
    ##  1:     1   2    1
    ##  2:     1   1    1
    ##  3:     1   1    2
    ##  4:     2   2    1
    ##  5:     2   1    1
    ##  6:     1   2    2
    ##  7:     1   2    1
    ##  8:     1   2    2
    ##  9:     2   1    1
    ## 10:     2   1    2
    

    最后我们可以订购我的 SubId, Day ,Time。由于表格是按我们想要的顺序排列的,我们只需将行从 1 编号到每个 SubId 中的观察数。

    df[order(SubId,Day,Time),X:=1:.N,SubId]
    
    
    ##> df
    ##    SubId Day Time X
    ## 1:     1   2    1 3
    ## 2:     1   1    1 1
    ## 3:     1   1    2 2
    ## 4:     2   2    1 4
    ## 5:     2   1    1 1
    ## 6:     1   2    2 5
    ## 7:     1   2    1 4
    ## 8:     1   2    2 6
    ## 9:     2   1    1 2
    ## 10:    2   1    2 3
    

    【讨论】:

    • 非常感谢您的详细解释!他们很有帮助!
    【解决方案2】:

    这可能有帮助

    library(dplyr)
    df1 %>% 
      group_by(SubID) %>% 
      mutate(X1 = row_number(as.numeric(paste0(Day, Time))))
    # A tibble: 11 x 5
    # Groups:   SubID [2]
    #   SubID   Day  Time     X    X1
    #   <int> <int> <int> <int> <int>
    # 1     1     1     1     1     1
    # 2     1     1     2     2     2
    # 3     1     1     3     3     3
    # 4     1     2     1     4     4
    # 5     1     2     2     5     5
    # 6     2     1     1     1     1
    # 7     2     1     2     2     2
    # 8     2     1     3     3     3
    # 9     2     2     3     6     6
    #10     2     2     2     5     5
    #11     2     2     1     4     4
    

    或使用order

    df1 %>% 
      group_by(SubID) %>% 
      mutate(X1 = order(Day, Time))
    

    data.table

    library(data.table)
    setDT(df1)[, X1 := order(Day, Time), by = SubID]
    

    数据

    df1 <- structure(list(SubID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
    2L, 2L), Day = c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L), 
    Time = c(1L, 2L, 3L, 1L, 2L, 1L, 2L, 3L, 3L, 2L, 1L), X = c(1L, 
    2L, 3L, 4L, 5L, 1L, 2L, 3L, 6L, 5L, 4L)), class = "data.frame", 
     row.names = c(NA, 
       -11L))
    

    【讨论】:

    • 代码运行了,但是当我去检查新变量 X1 时,R 说它是“null”。意思是我还没有重新创建变量?抱歉这个愚蠢的问题,我是 R 新手。我使用的代码是: data2 %>% group_by(SubID) %>% mutate(X1 = order(Day, Time)) data2$X1
    • @Susan 您需要将其分配给数据,即data2 &lt;- data2 %&gt;% group_by(SubID) %&gt;% mutate(X1 = order(Day, Time))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2018-05-22
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多