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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据R中的向量变化来改变行数相关的知识,希望对你有一定的参考价值。

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

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

答案

数据:

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.

以上是关于根据R中的向量变化来改变行数的主要内容,如果未能解决你的问题,请参考以下文章

R:我如何根据前一天的信息改变证券交易所每日指数的时间序列中的差距(假期)?

如何根据不同 R 生态系统中的另一个向量重写代码,将函数应用于行子集?

根据向量中的 *not* 选择 R 数据框中的列

删除向量中的指针会导致错误

bert不同句子中的词向量会变化吗

向量的变化第一指针