Строки прямого заполнения в таблице данных ar - PullRequest
3 голосов
/ 09 мая 2020

У меня есть большая таблица данных в формате ниже

Name       Value     1      2     3     4     5 
A           58       1      NA    NA    NA    NA
B           47       NA     1     NA    NA    NA
C           89       NA     NA    1     NA    NA
D           68       NA     NA    NA    1     NA
E           75       NA     NA    NA    NA    1

Я хотел бы переслать строки таблицы данных для достижения результатов ниже. Я умею пересылать столбцы с заполнением.

Name       Value     1      2     3     4     5 
A           58       1      1     1     1     1
B           47       NA     1     1     1     1
C           89       NA     NA    1     1     1
D           68       NA     NA    NA    1     1
E           75       NA     NA    NA    NA    1  

Помогите!

Ответы [ 2 ]

5 голосов
/ 10 мая 2020

data.table имеет собственную функцию nafill.

library(data.table) #v>=1.12.8
library(magrittr)

melt(dt, id = 1:2) %>% 
  .[, value := nafill(value, "locf"), by = Name] %>% 
  dcast(., ... ~ variable)

#    Name Value  1  2  3  4 5
# 1:    A    58  1  1  1  1 1
# 2:    B    47 NA  1  1  1 1
# 3:    C    89 NA NA  1  1 1
# 4:    D    68 NA NA NA  1 1
# 5:    E    75 NA NA NA NA 1

Данные

dt <- fread("Name       Value     1      2     3     4     5 
A           58       1      NA    NA    NA    NA
B           47       NA     1     NA    NA    NA
C           89       NA     NA    1     NA    NA
D           68       NA     NA    NA    1     NA
E           75       NA     NA    NA    NA    1")
2 голосов
/ 09 мая 2020

Используйте fill в tidyr, чтобы заполнить отсутствующие значения предыдущим значением.

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(3:7) %>%
  group_by(Name) %>%
  fill(value) %>%
  ungroup() %>% 
  pivot_wider()

# # A tibble: 5 x 7
#   Name  Value   `1`   `2`   `3`   `4`   `5`
#   <fct> <int> <int> <int> <int> <int> <int>
# 1 A        58     1     1     1     1     1
# 2 B        47    NA     1     1     1     1
# 3 C        89    NA    NA     1     1     1
# 4 D        68    NA    NA    NA     1     1
# 5 E        75    NA    NA    NA    NA     1

Примечание: Приведенный выше вывод такой же, как

df %>% fill(3:7, .direction = "up")

но логи c другое. Первый относится к «заполнение строк вперед» , а второй - «заполнение столбцов назад» . В других случаях они будут отличаться.


Данные

df <- structure(list(Name = structure(1:5, .Label = c("A", "B", "C", 
"D", "E"), class = "factor"), Value = c(58L, 47L, 89L, 68L, 75L
), `1` = c(1L, NA, NA, NA, NA), `2` = c(NA, 1L, NA, NA, NA), 
`3` = c(NA, NA, 1L, NA, NA), `4` = c(NA, NA, NA, 1L, NA), 
`5` = c(NA, NA, NA, NA, 1L)), class = "data.frame", row.names = c(NA, -5L))
...