【问题标题】:Creating an index for each subject in R在 R 中为每个主题创建索引
【发布时间】:2017-08-05 11:04:04
【问题描述】:

我正在处理一些随着时间的推移对受试者进行重复测量的数据。数据格式如下:

Subject <- as.factor(c(rep("A", 20), rep("B", 35), rep("C", 13)))
variable.A <- rnorm(mean = 300, sd = 50, n = Subject)
dat <- data.frame(Subject, variable.A)
dat

   Subject variable.A
1        A   334.6567
2        A   353.0988
3        A   244.0863
4        A   284.8918
5        A   302.6442
6        A   298.3162
7        A   271.4864
8        A   268.6848
9        A   262.3761
10       A   341.4224
11       A   190.4823
12       A   297.1981
13       A   319.8346
14       A   343.9855
15       A   332.5318
16       A   221.9502
17       A   412.9172
18       A   283.4206
19       A   310.9847
20       A   276.5423
21       B   181.5418
22       B   340.5812
23       B   348.5162
24       B   364.6962
25       B   312.2508
26       B   278.9855
27       B   242.8810
28       B   272.9585
29       B   239.2776
30       B   254.9140
31       B   253.8940
32       B   330.1918
33       B   300.7302
34       B   237.6511
35       B   314.4919
36       B   239.6195
37       B   282.7955
38       B   260.0943
39       B   396.5310
40       B   325.5422
41       B   374.8063
42       B   363.1897
43       B   258.0310
44       B   358.8605
45       B   251.8775
46       B   299.6995
47       B   303.4766
48       B   359.8955
49       B   299.7089
50       B   289.3128
51       B   401.7680
52       B   276.8078
53       B   441.4852
54       B   232.6222
55       B   305.1977
56       C   298.4580
57       C   210.5164
58       C   272.0228
59       C   282.0540
60       C   207.8797
61       C   263.3859
62       C   324.4417
63       C   273.5904
64       C   348.4389
65       C   174.2979
66       C   363.4353
67       C   260.8548
68       C   306.1833

我使用seq_along() 函数和dplyr 包为每个主题创建了每个观察的索引:

dat <- as.data.frame(dat %>%
            group_by(Subject) %>%
            mutate(index = seq_along(Subject)))

   Subject variable.A index
1        A   334.6567     1
2        A   353.0988     2
3        A   244.0863     3
4        A   284.8918     4
5        A   302.6442     5
6        A   298.3162     6
7        A   271.4864     7
8        A   268.6848     8
9        A   262.3761     9
10       A   341.4224    10
11       A   190.4823    11
12       A   297.1981    12
13       A   319.8346    13
14       A   343.9855    14
15       A   332.5318    15
16       A   221.9502    16
17       A   412.9172    17
18       A   283.4206    18
19       A   310.9847    19
20       A   276.5423    20
21       B   181.5418     1
22       B   340.5812     2
23       B   348.5162     3
24       B   364.6962     4
25       B   312.2508     5
26       B   278.9855     6
27       B   242.8810     7
28       B   272.9585     8
29       B   239.2776     9
30       B   254.9140    10
31       B   253.8940    11
32       B   330.1918    12
33       B   300.7302    13
34       B   237.6511    14
35       B   314.4919    15
36       B   239.6195    16
37       B   282.7955    17
38       B   260.0943    18
39       B   396.5310    19
40       B   325.5422    20
41       B   374.8063    21
42       B   363.1897    22
43       B   258.0310    23
44       B   358.8605    24
45       B   251.8775    25
46       B   299.6995    26
47       B   303.4766    27
48       B   359.8955    28
49       B   299.7089    29
50       B   289.3128    30
51       B   401.7680    31
52       B   276.8078    32
53       B   441.4852    33
54       B   232.6222    34
55       B   305.1977    35
56       C   298.4580     1
57       C   210.5164     2
58       C   272.0228     3
59       C   282.0540     4
60       C   207.8797     5
61       C   263.3859     6
62       C   324.4417     7
63       C   273.5904     8
64       C   348.4389     9
65       C   174.2979    10
66       C   363.4353    11
67       C   260.8548    12
68       C   306.1833    13

我现在要做的是设置一个分析,每 10 个观察值查看一次,所以我想创建另一个列,基本上每 10 个观察值给我一个数字。例如,主题 A 将有一个由十个“1”组成的序列,然后是一个由十个“2”组成的序列(即,两组 10)。我尝试使用 rep() 函数,但我遇到的问题是其他受试者没有可被 10 整除的观察数。

rep() 函数有没有办法只为分组分配下一个数字,即使它没有 10 个总观察值?例如,受试者 B 会有十个“1”、十个“2”和五个“3”(代表他的最后一组观察结果)?

【问题讨论】:

    标签: r indexing


    【解决方案1】:

    您可以使用模除%/%来生成id:

    dat %>% 
        group_by(Subject) %>% 
        mutate(chunk_id = (seq_along(Subject) - 1) %/% 10 + 1) -> dat1
    

    table(dat1$Subject, dat1$chunk_id)
    
    #     1  2  3  4
    #  A 10 10  0  0
    #  B 10 10 10  5
    #  C 10  3  0  0
    

    【讨论】:

    • 效果很好!我不能说我完全理解编码试图做什么,但它确实有效。谢谢!
    【解决方案2】:

    对于普通的香草基 R 解决方案,您也可以试试这个:

    dat$newcol <- 1
    dat$index <- ave(dat$newcol, dat$Subject, FUN = cumsum)
    dat$chunk_id <- (dat$index - 1) %/% 10 + 1
    

    当你运行上面的 table 命令时,你会得到什么

    table(dat$Subject, dat$chunk_id)
         1  2  3  4
      A 10 10  0  0
      B 10 10 10  5
      C 10  3  0  0
    

    如果您不想要额外的 'newcol' 列,只需使用 'NULL' 删除它:

    dat$newcol <- NULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多