我有一个冗长的数据集,其中一列包含在海湾中的两个(或每个同时一个)位置(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的船只有相同的情况。 “fillAnchorA”和“fillAnchorB”是我想要(col2)所需输出的地方。我认为保持A和B分开会更容易但也许不是吗?我在这里有点不知所措。
免责声明:这是残酷的。肯定有更好的办法...
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
由reprex package创建于2019-02-25(v0.2.1)