我列出了一个数据框,如下所示:
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
,但没有成功。谁能提供一些建议?
答案 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 == 0
和nx
等于最小值。此后,我们需要为该{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()