R-进行最后一次观察的次数不同

时间:2019-02-25 15:23:46

标签: r repeat locf

我有一个冗长的数据集,其中一列包含在海湾中两个位置(A或B)之一(或同时一个)中存在/不存在的游轮。目前,我已经连续几个月将每半小时的游轮数据与一系列时间戳进行匹配。我想将A和/或B进行多次变换,以表示在此新时间表上是否存在。每个游轮出现的次数都不同(以小时为单位)。

我从这样的事情开始:

     [,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))

(AnchorageA拥有到达锚地A的所有游轮(以A表示,而AnchorageB拥有去锚地B的所有游轮)。我想要“ col2”的所需输出是“ fillAnchorA”和“ fillAnchorB”。我认为将A和B分开比较容易,但也许不会吗?我在这里有点茫然。

1 个答案:

答案 0 :(得分:0)

免责声明:这是残酷的。一定有更好的方法...

  • 首先,我创建数据框。
  • 接下来,我添加带有行索引的列,以方便引用。
  • 然后,我创建一个填充函数,该函数采用当前行索引,重复次数,要重复的字符以及数据帧中的行数。该函数产生的数组包含NA或字符c的游程。
  • 最后,我使用pmap遍历数据帧中不包含NA的行,并为这些行中的每一行创建数组,如上所述。第二个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

reprex package(v0.2.1)于2019-02-25创建