根据R中的向量更改行数

时间:2018-08-01 21:20:30

标签: r dplyr

我列出了一个数据框,如下所示:

unique Treatment Rep Beak time  nx  survival
1.1.1          1   1    1    0  25         0
1.1.1          1   1    1    0  25         0
1.1.1          1   1    1    0  25         0
1.1.1          1   1    1    2  24         0
1.1.1          1   1    1    2  24         0
1.1.1          1   1    1    4  17         1
1.1.1          1   1    1    4  17         1
1.1.1          1   1    1    4  17         1
1.1.1          1   1    1    4  17         1
1.1.2          1   1    2    0  25         0
1.1.2          1   1    2    0  25         0
1.1.2          1   1    2    2  22         0
1.1.2          1   1    2    2  22         0
1.1.2          1   1    2    2  22         0
1.1.2          1   1    2    2  22         0
1.1.2          1   1    2    4  16         1
1.1.2          1   1    2    4  16         1
1.1.2          1   1    2    4  16         1
1.1.2          1   1    2    4  16         1

我需要过滤出生存率为0的行,但仍要确保代表了这些人的time。本质上,我想修改行,以使如果nx中的值是>的最小nx值,并按unique分组,则行数应等于该组的最大nx值减去nx。这是我想出的代码:

df <- df %>%
group_by(unique) %>%
mutate(nx = case_when(
nx > min(nx) ~ rep(.$nx, each = max(.$nx)-.$nx)))

所需的数据框应如下所示:

unique Treatment Rep Beak time  nx  survival
1.1.1          1   1    1    2  24         0 #one row left with nx of 24
1.1.1          1   1    1    4  17         1
1.1.1          1   1    1    4  17         1
1.1.1          1   1    1    4  17         1
1.1.1          1   1    1    4  17         1
1.1.2          1   1    2    2  22         0 #3 rows left with nx of 22
1.1.2          1   1    2    2  22         0
1.1.2          1   1    2    2  22         0
1.1.2          1   1    2    4  16         1
1.1.2          1   1    2    4  16         1
1.1.2          1   1    2    4  16         1
1.1.2          1   1    2    4  16         1

我似乎很难将行复制适当的次数。我试图将其强制转换为矩阵并设置nrow = max(.$nx)-.$nx,但没有成功。谁能提供一些建议?

1 个答案:

答案 0 :(得分:1)

数据:

dat <- data_frame(unique = c(rep("1.1.1", 9),
                             rep("1.1.2", 10)),
                  treatment = rep(1, 19),
                  Rep = rep(1, 19),
                  Break = c(rep(1, 9),
                            rep(2, 10)),
                  time = c(0, 0, 0, 2, 2, 
                           4, 4, 4, 4, 
                           0, 0, 
                           2, 2, 2, 2, 
                           4, 4, 4, 4),
                  nx = c(25, 25, 25,
                         24, 24, 
                         17, 17, 17, 17,
                         25, 25, 
                         22, 22, 22, 22,
                         16, 16, 16, 16),
                  survival = c(rep(0, 5),
                               rep(1, 4),
                               rep(0, 6),
                               rep(1, 4))
                  )

首先,按unique分组,并创建一个名为keep的变量,以查找组内max(nx)nx之间的差异。然后,按unique survival分组。保持每个实例均为survival == 1,并使每个实例中的survival == 0nx等于最小值。此后,我们需要为该{unique,Survival}组过滤掉大于survival == 0的{​​{1}}每个实例。我们可以使用keep来完成此操作,确保仍然保留row_numbers的每个实例。

survival == 0

结果:

dat %>% 
  group_by(unique) %>%
  mutate(keep = max(nx) - nx) %>% 
  group_by(unique, survival) %>%
  filter(survival == 0 & nx == min(nx) |
           survival == 1) %>% 
  filter(row_number() %in% 1:unique(keep) |
           survival == 1) %>% 
  select(-keep) %>% 
  ungroup()