Как изменить значения в группе? - PullRequest
0 голосов
/ 14 марта 2019

Я создал столбец с успехом вложения со значением "1", если судьба гнезда была "взрослением" или "оперением", и 0, если судьба гнезда была "неудачей гнезда". В некоторых случаях судьба гнезда «возрождалась» в первом посещении и «проваливалась» во втором посещении. В таких случаях успех одного гнезда оказался равным 1 и 0 (см. Гнездо "D063" и "D063").

Как убрать «1» или присвоить «NA» и оставить «0» только в случаях с 1 и 0 в случае успеха одного и того же гнезда?

Другими словами, я хотел бы иметь только один результат успеха на гнездо (один или 0), а не несколько. И я хочу сохранить все ряды.

Мои данные выглядят так:

Пример данных:

structure(list(date = structure(c(4L, 2L, 1L, 5L, 3L, 1L, 5L, 
2L, 1L, 5L, 3L, 1L, 5L, 2L, 1L), .Label = c("14/06/2018", "17/05/2018", 
"21/05/2018", "5/05/2018", "6/05/2018"), class = "factor"), nest.code = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L), .Label = c("D046", 
"D047", "D062", "D063", "W18003"), class = "factor"), year = c(2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L), species = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("AA", 
"BB"), class = "factor"), visit = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), eggs = c(1L, 0L, 0L, 1L, 0L, 
0L, 2L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L), chicks = c(0L, NA, NA, 
0L, 1L, 0L, 0L, 2L, 0L, 0L, 1L, 0L, 0L, NA, 1L), fate = structure(c(2L, 
4L, 5L, 2L, 4L, 3L, 2L, 4L, 3L, 2L, 4L, 3L, 2L, 5L, 1L), .Label = c("fledged", 
"incubating", "nest failed", "rearing", "unknown"), class = "factor"), 
    success = c(NA, 1L, NA, NA, 1L, 0L, NA, 1L, 0L, NA, 1L, 0L, 
    NA, NA, 1L)), class = "data.frame", row.names = c(NA, -15L
))

Это код, который я пробовал:

datanew <- data %>% 
  group_by(year, species, nest.code)%>% 
  mutate(Real_success = ifelse(success ==1 & 0, 0, success))

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Вот подход, который ставит ноль во всех строках для гнезд с по крайней мере одним отказом, 1, если есть хотя бы один успех и нет отказа, и NA в противном случае:

library(dplyr)
mydata %>% 
  group_by(year, species, nest.code) %>% 
  mutate(real_success = case_when(
    sum(1-success, na.rm = T) > 0   ~   0, # There was a fail
    sum(success,   na.rm = T) > 0   ~   1,
    TRUE                            ~   NA_real_)) %>%
 ungroup()

# A tibble: 15 x 10
   date       nest.code  year species visit  eggs chicks fate       success real_success
   <fct>      <fct>     <int> <fct>   <int> <int>  <int> <fct>        <int>        <dbl>
 1 5/05/2018  D046       2018 AA          1     1      0 incubating      NA            1
 2 17/05/2018 D046       2018 AA          2     0     NA rearing          1            1
 3 14/06/2018 D046       2018 AA          3     0     NA unknown         NA            1
 4 6/05/2018  D047       2018 AA          1     1      0 incubating      NA            0
 5 21/05/2018 D047       2018 AA          2     0      1 rearing          1            0
 6 14/06/2018 D047       2018 AA          3     0      0 nest fail…       0            0
 7 6/05/2018  D062       2018 AA          1     2      0 incubating      NA            0
 8 17/05/2018 D062       2018 AA          2     0      2 rearing          1            0
 9 14/06/2018 D062       2018 AA          3     0      0 nest fail…       0            0
10 6/05/2018  D063       2018 AA          1     1      0 incubating      NA            0
11 21/05/2018 D063       2018 AA          2     0      1 rearing          1            0
12 14/06/2018 D063       2018 AA          3     0      0 nest fail…       0            0
13 6/05/2018  W18003     2018 BB          1     1      0 incubating      NA            1
14 17/05/2018 W18003     2018 BB          2     0     NA unknown         NA            1
15 14/06/2018 W18003     2018 BB          3     0      1 fledged          1            1
0 голосов
/ 14 марта 2019

Я не уверен, как вы себе это представляете, чтобы выглядеть в конце. Хотите ли вы сохранить все строки, хотите ли вы их упорядочить каким-либо образом? Во всяком случае, это то, что я придумал:

ОБНОВЛЕНИЕ: Извините, я пропустил "оперение" в первом ответе


dat %>% 
  group_by(year, species, nest.code)%>%
  arrange(year, species, nest.code, success) %>%
  mutate(success = ifelse(row_number() > 1, NA, success))

# A tibble: 15 x 9
# Groups:   year, species, nest.code [5]
   date       nest.code  year species visit  eggs chicks outcome     success
   <fct>      <fct>     <int> <fct>   <int> <int>  <int> <fct>         <int>
 1 17/05/2018 D046       2018 AA          2     0     NA rearing           1
 2 5/05/2018  D046       2018 AA          1     1      0 incubating       NA
 3 14/06/2018 D046       2018 AA          3     0     NA unknown          NA
 4 14/06/2018 D047       2018 AA          3     0      0 nest failed       0
 5 21/05/2018 D047       2018 AA          2     0      1 rearing          NA
 6 6/05/2018  D047       2018 AA          1     1      0 incubating       NA
 7 14/06/2018 D062       2018 AA          3     0      0 nest failed       0
 8 17/05/2018 D062       2018 AA          2     0      2 rearing          NA
 9 6/05/2018  D062       2018 AA          1     2      0 incubating       NA
10 14/06/2018 D063       2018 AA          3     0      0 nest failed       0
11 21/05/2018 D063       2018 AA          2     0      1 rearing          NA
12 6/05/2018  D063       2018 AA          1     1      0 incubating       NA
13 14/06/2018 W18003     2018 BB          3     0      1 fledged           1
14 6/05/2018  W18003     2018 BB          1     1      0 incubating       NA
15 17/05/2018 W18003     2018 BB          2     0     NA unknown          NA

определенно будет более простой способ сделать это. Нет про себя в dplyr сам. Если это работает, я счастлив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...