Редактировать строковое значение на основе условия / другого столбца?

#r #dplyr

#r #dplyr

Вопрос:

Я очищаю большой набор данных, и у меня есть Comments столбец, в котором я комментирую изменения, внесенные в данные. Я предоставил фиктивный набор примеров ниже в качестве примера того, чего я пытаюсь достичь. Я использую tidyverse пакеты.

Данные:

 structure(list(Date = structure(c(17199, 17226, 17263, 17300, 
17346, 17504, 17508), class = "Date"), Skipper = c("Agatha", 
"Gertrude", "Julio", "Dylis", "Agatha", "Dylis", "Julio"), Success = c("No", 
"Yes", "Yes", "Yes", "No", "Yes", "No"), Time = c(60L, 50L, 120L, 
30L, 100L, 120L, 40L), Comments = c("Pirates spotted.", "Illegal fishers spotted.", 
"Engine troubles.", "Lost fishing line.", NA, "Pirates spotted.", 
"Lost fishing line.")), class = "data.frame", row.names = c(NA, 
-7L))
  

Я хочу добавить текст к строковым значениям в Comments по отношению к Date , не удаляя уже существующие значения.

Итак, для 2017-04-07 и 2017-12-04 я хотел бы добавить Iceberg spotted. к Comments для уважаемых Date ‘s.

         Date  Skipper Success Time                 Comments
1 2017-02-02   Agatha      No   60         Pirates spotted.
2 2017-03-01 Gertrude     Yes   50 Illegal fishers spotted.
3 2017-04-07    Julio     Yes  120         Engine troubles.
4 2017-05-14    Dylis     Yes   30       Lost fishing line.
5 2017-06-29   Agatha      No  100                     <NA>
6 2017-12-04    Dylis     Yes  120         Pirates spotted.
7 2017-12-08    Julio      No   40       Lost fishing line.

  

Используя stringr и str_c R_example$Comments %>% str_c("Iceberg spotted")

[1] "Pirates spotted.Iceberg spotted"

Как я могу выбрать, к каким датам применять приведенный выше код ^, чтобы я мог видеть изменения, внесенные в набор данных за указанные даты. Нужно ли мне указывать функцию filter или if_else ?

Я пытался с case_when , но это заменяет существующие значения. Я также мог бы сделать это, создав другой столбец, а затем связав два столбца вместе, но я предпочитаю этого не делать.

 R_example %>% 
  mutate(Comments = case_when(Date == "2017-04-07" amp; Date == "2017-12-04" ~ "Iceberg spotted.", 
                              TRUE ~ as.character(Comments)))
  

Спасибо.

Редактировать:

Я забыл небольшую деталь в своем наборе данных. Если у меня есть несколько строк для рыбалки и значений в Comments столбце <NA> , как строка может заменить <NA> значения вместо добавления к <NA> значению? Вот так:

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

         Date  Skipper Success Time         Comments
1 2017-02-02   Agatha      No   60 Pirates spotted.
2 2017-02-02   Agatha      No   60             <NA>

  

Чего я хотел бы достичь:

         Date  Skipper Success Time                          Comments
1 2017-02-02   Agatha      No   60 Pirates spotted. Iceberg spotted.
2 2017-02-02   Agatha      No   60                  Iceberg spotted.

  

Что я в настоящее время получаю из кода в ответах ниже:

         Date  Skipper Success Time                          Comments
1 2017-02-02   Agatha      No   60 Pirates spotted. Iceberg spotted.
2 2017-02-02   Agatha      No   60                NAIceberg spotted.

  

Комментарии:

1. Вы имеете в виду, что вам нужны дополнительные строки с новыми комментариями или добавить строку «Замеченный айсберг» к существующим комментариям в виде более длинных строк? Кроме того, в вашем примере данных нет «2017-04-17». Это опечатка, или вы имеете в виду, что в таком случае вам нужна новая строка?

2. Привет @Z. Lin Я хотел бы добавить строку «Замечен айсберг» к существующим строкам для 2017-04-07 и 2017-12-04 . Делая их длиннее :). Это была опечатка, извините, я сейчас внес правку!

3.В вашем case_when примере есть проблема, поскольку дата не может быть 2017-04-07 и 2017-12-04 одновременно. Вам нужен оператор OR ( | вместо amp; ).

Ответ №1:

Я бы использовал ifelse в этом случае

 dta %>% 
  mutate(
    Comments = if_else(Date %in% c(as.Date("2017-04-07"), as.Date("2017-12-04")), 
                       paste0(Comments, "Iceberg spotted"), 
                       Comments)
  )
  

Комментарии:

1. итак, если Date столбец распознан как Date и у нас есть много дат для добавления строк, мы могли бы сделать: dta %>% mutate(Comments = if_else(Date %in% Date == "2017-04-07" | Date == "2017-12-04", paste0(Comments, "Iceberg spotted"), Comments)) ?

Ответ №2:

Решение с базовым R:

 # Find which rows will be changed
i <- which(df$Date %in% c(as.Date("2017-04-07"), as.Date("2017-12-04")))

# Modify the rows accordingly
df[i,"Comments"] <- paste(df[i,"Comments"], "Iceberg Spotted.")
  

Приводит к:

 > df
        Date  Skipper Success Time                          Comments
1 2017-02-02   Agatha      No   60                  Pirates spotted.
2 2017-03-01 Gertrude     Yes   50          Illegal fishers spotted.
3 2017-04-07    Julio     Yes  120 Engine troubles. Iceberg Spotted.
4 2017-05-14    Dylis     Yes   30                Lost fishing line.
5 2017-06-29   Agatha      No  100                              <NA>
6 2017-12-04    Dylis     Yes  120 Pirates spotted. Iceberg Spotted.
7 2017-12-08    Julio      No   40                Lost fishing line.