R - переносить последнее наблюдение разное количество раз - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть длинный набор данных с одним столбцом, содержащим круизные лайнеры, которые присутствуют / отсутствуют в одном из двух (или по одному в каждом одновременно) местах (А или В) в заливе.В настоящее время у меня есть данные о круизном судне, сопоставленные с серией отметок времени каждые полчаса в течение нескольких месяцев подряд.Я хочу перенести А и В разное количество раз, чтобы представить присутствие / отсутствие в этом новом масштабе времени.Каждое круизное судно присутствует разное количество раз (в часах).

Я начинаю с чего-то вроде этого:

     [,1]    [,2] [,3]
[1,] "Ship1" "A"  "4" 
[2,] "Ship2" "B"  "5" 
[3,] NA      NA   NA  
[4,] NA      NA   NA  
[5,] NA      NA   NA  
[6,] "Ship3" "A"  "2" 
[7,] NA      NA   NA

И я хочу это:

     [,1]    [,2]  [,3]
[1,] "Ship1" "A"   "4" 
[2,] "Ship2" "A,B" "5" 
[3,] NA      "A,B" NA  
[4,] NA      "A,B" NA  
[5,] NA      "B"   NA  
[6,] "Ship3" "A,B" "2" 
[7,] NA      "A"   NA

Я пробовал несколько вещей безрезультатно (и некоторые сбой):

data$fillAnchorA = na.locf(data$AnchorageA, na.rm = F, mingap = lag(data$hoursPresent))

data$fillAnchorB = rep(na.locf(data$AnchorageB, na.rm = F), length(data$hoursPresent))

data$fillAnchorB = rep(data$AnchorageB, length(mastercruisedata$hoursPresent))

(у Анкориджа есть все круизные лайнеры, прибывающие на якорную стоянку А (обозначены буквой А), а у Анкориджа B то же самое для кораблей, идущих на якорную стоянку В).«fillAnchorA» и «fillAnchorB» - это то место, где я хочу получить желаемый результат для (col2).Я подумал, что было бы легче держать A и B отдельно, но, возможно, нет?Я немного растерялся.

1 Ответ

0 голосов
/ 25 февраля 2019

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это брутальный .Должен быть лучший способ ...

  • Сначала я создаю фрейм данных.
  • Затем я добавляю столбец с индексами строк для удобства ссылок.
  • Затем я создаю функцию заполнения, которая принимает текущий индекс строки, количество повторений, символ, который будет повторяться, и количество строк во фрейме данных.Эта функция создает массивы, которые содержат NA или наборы символов, c.
  • Наконец, я использую pmap для запуска по строкам во фрейме данных, которые не содержат NA s.и создайте массивы, как описано выше, для каждой из этих строк.Второй pmap вызов проходит через эти массивы, вставляя вместе отсортированные, уникальные значения, отличные от NA.Затем он добавляется в соответствующий столбец исходного фрейма данных.
library(dplyr)
library(magrittr)
library(purrr)

# Create data frame
df <- data.frame(Ship = c("Ship1", "Ship2", NA, NA, NA, "Ship3", NA),  
                 l = c("A", "B", NA, NA, NA, "A", NA),  
                 r = c(4, 5, NA, NA, NA, 2, NA))

# Add row numbers
df %<>% 
  tibble::rowid_to_column() 

# Fill function
fill_foo <- function(id, n, c, nr = nrow(df)){
  tmp <- rep(NA, nr)
  tmp[id:(id+n-1)] <- as.character(c)
  tmp
}

# Go through each no-NA row
df$l <- with(df %>% na.omit(), pmap(list(rowid, r, l), fill_foo)) %>% 
  pmap(function(...)paste(sort(unique(na.omit(unlist(c(...))))), collapse = ",")) %>% 
  unlist

# Print results
print(df)
#>   rowid  Ship   l  r
#> 1     1 Ship1   A  4
#> 2     2 Ship2 A,B  5
#> 3     3  <NA> A,B NA
#> 4     4  <NA> A,B NA
#> 5     5  <NA>   B NA
#> 6     6 Ship3 A,B  2
#> 7     7  <NA>   A NA

Создан в 2019-02-25 с помощью пакета Представить (v0.2.1)

...