in R Заменить значения следующим значением - PullRequest
0 голосов
/ 06 мая 2020

У меня есть набор данных, который я очищаю. Второй столбец начинается с - а значение под ним - то, что мне нужно. Как мне заменить - на значение под ним.

У меня есть тысячи таких строк, а значение под ним - это разные имена, поэтому я не могу просто сделать

df $ agent [df $ agent == "-"] <- "john "</p>

Это нужно сделать более 1000 раз. Я ищу способ сделать это намного эффективнее.

1   Field Support   -       6:00 AM - 6:59 AM   1/1/2020    9   
3   Field Support   John    7:00 AM - 7:59 AM   1/1/2020    4   
4   Field Support   John    8:00 AM - 8:59 AM   1/1/2020    4

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Вот решение с базовым R и пакетом tidyr.

library(tidyr)

col_num <- 3
is.na(df[[col_num]]) <- df[[col_num]] == '-'
fill(df, all_of(col_num), .direction = "up")
#  V1            V2   V3                V4       V5 V6
#1  1 Field Support John 6:00 AM - 6:59 AM 1/1/2020  9
#2  3 Field Support John 7:00 AM - 7:59 AM 1/1/2020  4
#3  4 Field Support John 8:00 AM - 8:59 AM 1/1/2020  4

Data

df <- read.table(text = "
1   'Field Support'   -       '6:00 AM - 6:59 AM'   1/1/2020    9   
3   'Field Support'   John    '7:00 AM - 7:59 AM'   1/1/2020    4   
4   'Field Support'   John    '8:00 AM - 8:59 AM'   1/1/2020    4
")
0 голосов
/ 06 мая 2020

Вот решение без использования пакетов:

> df <- data.frame("ID" = c(1, 3, 4, 5, 8), 
                  "Job" = rep("Field Support", 5), 
                  "Agent" = c("-", rep("John", 2), "-", "Mary"), 
                  "Hours" = c("6:00 AM - 6:59 AM", 
                              "7:00 AM - 7:59 AM", 
                              "8:00 AM - 8:59 AM", 
                              "9:00 AM - 9:59 AM", 
                              "10:00 AM - 10:59 AM"), 
                  "Date" = rep("1/1/2020", 5), 
                  "Metric" = c(9, 4, 4, 6, 2))
> print(df)
  ID           Job Agent               Hours     Date Metric
1  1 Field Support     -   6:00 AM - 6:59 AM 1/1/2020      9
2  3 Field Support  John   7:00 AM - 7:59 AM 1/1/2020      4
3  4 Field Support  John   8:00 AM - 8:59 AM 1/1/2020      4
4  5 Field Support     -   9:00 AM - 9:59 AM 1/1/2020      6
5  8 Field Support  Mary 10:00 AM - 10:59 AM 1/1/2020      2

> df$Agent[which(df$Agent == "-")] <- df$Agent[which(df$Agent == "-") + 1]

> print(df)
  ID           Job Agent               Hours     Date Metric
1  1 Field Support  John   6:00 AM - 6:59 AM 1/1/2020      9
2  3 Field Support  John   7:00 AM - 7:59 AM 1/1/2020      4
3  4 Field Support  John   8:00 AM - 8:59 AM 1/1/2020      4
4  5 Field Support  Mary   9:00 AM - 9:59 AM 1/1/2020      6
5  8 Field Support  Mary 10:00 AM - 10:59 AM 1/1/2020      2
0 голосов
/ 06 мая 2020

Вы можете использовать case_when и lead из пакета dplyr:

library(dplyr)
data %>%
  mutate(Name = case_when(Name == "-" ~ lead(Name),
                          TRUE ~ Name))
           Role Name              Time     Date Value
1 Field Support John 6:00 AM - 6:59 AM 1/1/2020     9
2 Field Support John 7:00 AM - 7:59 AM 1/1/2020     4
3 Field Support John 8:00 AM - 8:59 AM 1/1/2020     4

Data

data <- structure(list(Role = structure(c(1L, 1L, 1L), .Label = "Field Support", class = "factor"), 
    Name = structure(c(1L, 2L, 2L), .Label = c("-", "John"), class = "factor"), 
    Time = structure(1:3, .Label = c("6:00 AM - 6:59 AM", "7:00 AM - 7:59 AM", 
    "8:00 AM - 8:59 AM"), class = "factor"), Date = structure(c(1L, 
    1L, 1L), .Label = "1/1/2020", class = "factor"), Value = c(9L, 
    4L, 4L)), class = "data.frame", row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...