Эффективный способ добавить новое поле на основе значений в другом поле в R - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь создать новое поле на основе существующего поля. По сути, если строка в существующем поле содержит строку, начинающуюся с #, используйте значение в этой строке для строки в новом поле. Если это не так, используйте самое последнее значение в существующем поле (с #) для этой строки в новом поле.

Извините, если это звучит странно, вот иллюстрация:

df = data.frame(V1 = c("#text1", 1, 3, 4, "#text2", 2, 4, 3, "#text3"), 
                stringsAsFactors = FALSE)

df_desired = data.frame(V1 = c("#text1", 1, 3, 4, "#text2", 2, 4, 3, "#text3"), 
                        newcol = c("#text1", "#text1", "#text1", "#text1", "#text2", "#text2", "#text2", "#text2", "#text3"), 
                        stringsAsFactors = FALSE)

Вот то, что я пытался, но он возвращает ошибку:

df_new = df %>% mutate(newcol = ifelse(grep("#", df$V1[]) == 1, df$V1[],lag(df$V1[])))

Спасибо!

1 Ответ

1 голос
/ 06 ноября 2019

Мы можем скопировать V1 в newcol, если в нем присутствует "#", или скопировать NA, а затем заполнить эти пропущенные значения tidyr::fill.

library(dplyr)

df %>%
  mutate(newcol = ifelse(grepl("#", V1), V1, NA))  %>%
  tidyr::fill(newcol)

#      V1 newcol
#1 #text1 #text1
#2      1 #text1
#3      3 #text1
#4      4 #text1
#5 #text2 #text2
#6      2 #text2
#7      4 #text2
#8      3 #text2
#9 #text3 #text3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...