如何根据r中以前的列创建具有发展阶段持续时间的新列?

bakd9h0s  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(94)

我有一个数据框架,代表动物随时间的发展。我有治疗和物种的列,然后有许多列代表天。它看起来像这样:

df <- data.frame (Species  = c("sp1", "sp1", "sp2"),
                  Treatment = c("hot", "cold", "hot"),
                  Apr1 = c("egg", "egg", "egg"),
                  Apr2 = c("1", "egg", "1"),
                  Apr3 = c("2", "egg", "1"),
                  Apr4 = c("adult", "1", "2"))

我需要创建列,告诉我每个阶段的天数和总发育时间,以便我可以比较不同物种和处理的这些值。我希望 Dataframe 看起来像这样的输出:

Species Treatment Apr1 Apr2 Apr3  Apr4 Egg Instar1 Instar2 DaysToAdult
1     sp1       hot  egg    1    2 adult   1       1       1           4
2     sp1      cold  egg  egg  egg     1   3       1       0          NA
3     sp2       hot  egg    1    1     2   1       2       1          NA

有没有一个函数可以很容易地从前面的列中提取这些值?我有~15个发展阶段,所以如果需要的话,可以单独创建每个列。

tuwxkamq

tuwxkamq1#

我相信,如果我们事先将data.frame转换为long,那么预期的分析可能会更容易执行:

library(dplyr)
library(tidyr)
library(stringr)

df |>
    mutate(index = row_number(),
           .before = everything()) |> 
    pivot_longer(cols = starts_with("Apr"),
                 names_to = "Apr",
                 names_transform = \(x) str_extract(x, "\\d")) |> 
    type_convert()|> 
    group_by(index) |>
    reframe(days_to_adult = min(Apr[value == "adult"]) |> 
                {\(x) ifelse(is.infinite(x), NA, x)}())

# A tibble: 3 × 2
  index days_to_adult
  <int>         <dbl>
1     1             4
2     2            NA
3     3            NA
ajsxfq5m

ajsxfq5m2#

玩了一会儿,终于到了:

df_new <- df %>%
  mutate(
         Egg = rowSums(df == "egg"),
         Instar1 = rowSums(df == "1"),
         Instar2 = rowSums(df == "2"),
         DaysToAdults = Egg + Instar1 + Instar2
         )

相关问题