我有一个冗长的数据集,其中一列包含在海湾中两个位置(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分开比较容易,但也许不会吗?我在这里有点茫然。
答案 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创建