根据R中的向量变化来改变行数

问题描述 投票:0回答:1

我有一个数据框列出如下:

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,但它没有成功。有人可以提供一些建议吗?

r dplyr
1个回答
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之间的差异。然后,由uniquesurvival分组。保持每个实例都是survival == 1survival == 0nx等于最小值的每个实例。在此之后,我们需要过滤掉{unique,survival}组中大于survival == 0的每个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()

结果:

# A tibble: 12 x 7
   unique treatment   Rep Break  time    nx survival
   <chr>      <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl>
 1 1.1.1         1.    1.    1.    2.   24.       0.
 2 1.1.1         1.    1.    1.    4.   17.       1.
 3 1.1.1         1.    1.    1.    4.   17.       1.
 4 1.1.1         1.    1.    1.    4.   17.       1.
 5 1.1.1         1.    1.    1.    4.   17.       1.
 6 1.1.2         1.    1.    2.    2.   22.       0.
 7 1.1.2         1.    1.    2.    2.   22.       0.
 8 1.1.2         1.    1.    2.    2.   22.       0.
 9 1.1.2         1.    1.    2.    4.   16.       1.
10 1.1.2         1.    1.    2.    4.   16.       1.
11 1.1.2         1.    1.    2.    4.   16.       1.
12 1.1.2         1.    1.    2.    4.   16.       1.
© www.soinside.com 2019 - 2024. All rights reserved.