如何在R中从数据框中提取第一次出现非零数字的时间?

6
在一项实验中,我试图找到第一胎出生的时间。有四只动物,按照id和rep给出(A1、A2、B1、B2),它们的年龄和幼崽。对于每个id和rep,我只想保留第一胎出生的行。
id <- c("A","A","A","A","A","A","B","B","B","B","B","B","B","B","B")
rep <- c(1,1,1,2,2,2,1,1,1,1,2,2,2,2,2)
age <- c(0,1,2,0,1,2,0,1,2,3,0,1,2,3,4)
babies <- c(0,0,1,0,1,0,0,0,0,1,0,0,0,1,1)

df <- data.frame(id,rep,age,babies)

所以在这里,最终的数据框应该是这样的

id <- c("A","A","B","B")
rep <- c(1,2,1,2)
age <- c(2,1,3,3)
babies <- c(1,1,1,1)

df <- data.frame(id,rep,age,babies)
4个回答

4
library(dplyr)
df %>% 
   group_by(id, rep) %>% 
   slice_max(babies, n = 1, with_ties = FALSE) %>%
    ungroup

df %>%
   group_by(id, rep) %>% 
   filter(row_number() == which(babies > 0)[1]) %>% 
   ungroup

我在文本中表述不够清楚,婴儿的数量也可能大于1。所以我不确定slice_max是否适用? - Rspacer
@Biotechgeek 我猜这就是我展示“过滤器”方法的原因,因为我不确定你的数据是否只有二进制。 - akrun

3

你只需要进行 group_byfilter 操作:

df %>% 
  group_by(id, rep) %>% 
  filter(babies > 0) %>% 
  filter(age == min(age)) %>% 
  ungroup()

2

这里有一个关于 arrange 的例子:

library(dplyr)

df %>% 
  group_by(id, rep) %>% 
  arrange(-babies, .by_group = TRUE) %>% 
  slice(1)

  id      rep   age babies
  <chr> <dbl> <dbl>  <dbl>
1 A         1     2      1
2 A         2     1      1
3 B         1     3      1
4 B         2     3      1

1

一种替代方案

df |> 
  group_by(id,rep) |> 
  slice(which(c(0, diff(babies)) == 1)) |> 
  ungroup()

随着年龄的增长,个人生育孩子的数量也会增加。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接