#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.