创建一个变量,每行加一,但根据条件重置

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

我目前正在从事一个项目,我试图根据养蜂人的观察来计算多个蜂巢中蜂王的年龄。他们通常用一种颜色标记女王,如果/当女王去世时,他们会再次标记她。所以在我的表格中你可以看到这样的数据形式

Colony  month   Queen_status

11  24-02   Not seen
11  24-03   Queen marked
11  24-04   Queen marked
11  24-05   Queen marked
11  24-06   Queen marked

12  24-02   Queen marked
12  24-03   Queen marked
12  24-04   New queen marked the day of the visite
12  24-05   Queen marked
12  24-06   Queen marked

根据蜜蜂背部的颜色,我们可以估算出研究时的“初始年龄”。我想创建一个名为“女王年龄”的值,该值每月增加 1,但如果 queen_status 是“新女王标记了访问者的日期”,则必须重置为零。 这是我想象的桌子:

Colony  month   Queen_status        Initale age of queen    Relatif_age Actual age
11  24-02   Queen marked        25          1       26
11  24-03   Queen marked        25          2       27
11  24-04   Queen marked        25          3       28
11  24-05   Queen marked        25          4       29
11  24-06   Queen marked        25          5       30
12  24-02   Queen marked        30          1       31
12  24-03   Queen marked        30          2       32
12  24-04   New queen       30          1       1
12  24-05   Queen marked        30          2       2
12  24-06   Queen marked        30          3       3

我无法让它发挥作用。我最后的努力如下

df <- df %>%
  mutate(Colony = as.factor(Colony)) %>%
  group_by(Colony) %>%
  summarize(
    month = month,
    Queen status = Queen status,

Relative age = ifelse(month == min(month) & Queen status != "New queen", 1, with(df, ave(Queen status, cumsum(Statut_de_la_reine == Queen status "), FUN = seq_along))))

我也尝试过 case_when 但我无法让它工作

理想情况下,我只想要数据框中的最后一列。

r if-statement case cumsum
1个回答
0
投票

使用 data.table 包非常简单:

library(data.table)
DT <- fread('Colony  month   Queen_status        "Initale age of queen"    Relatif_age "Actual age"
11  24-02   "Queen marked"        25          1       26
11  24-03   "Queen marked"        25          2       27
11  24-04   "Queen marked"        25          3       28
11  24-05   "Queen marked"        25          4       29
11  24-06   "Queen marked"        25          5       30
12  24-02   "Queen marked"        30          1       31
12  24-03   "Queen marked"        30          2       32
12  24-04   "New queen"       30          1       1
12  24-05   "Queen marked"        30          2       2
12  24-06   "Queen marked"        30          3       3')

setDT(DT) 

DT[, Relatif_age_1 := rowid(Colony, cumsum(Queen_status == "New queen"))]
DT[, Actual_age_1 := fifelse(cumsum(Queen_status == "New queen") == 0, 
                             `Initale age of queen`, 
                             0) + Relatif_age_1, by = Colony]
#     Colony  month Queen_status Initale age of queen Relatif_age Actual age Relatif_age_1 Actual_age_1
#      <int> <char>       <char>                <int>       <int>      <int>         <int>        <num>
#  1:     11  24-02 Queen marked                   25           1         26             1           26
#  2:     11  24-03 Queen marked                   25           2         27             2           27
#  3:     11  24-04 Queen marked                   25           3         28             3           28
#  4:     11  24-05 Queen marked                   25           4         29             4           29
#  5:     11  24-06 Queen marked                   25           5         30             5           30
#  6:     12  24-02 Queen marked                   30           1         31             1           31
#  7:     12  24-03 Queen marked                   30           2         32             2           32
#  8:     12  24-04    New queen                   30           1          1             1            1
#  9:     12  24-05 Queen marked                   30           2          2             2            2
# 10:     12  24-06 Queen marked                   30           3          3             3            3
© www.soinside.com 2019 - 2024. All rights reserved.