По сути, вы хотите собрать все столбцы, сгруппированные по каждой строке.Затем с нетерпением ждем ведущего значения и последнего значения.Так что-то вроде этого в dplyr :
dat %>%
mutate(row=row_number()) %>%
gather(key, src, -row) %>%
drop_na() %>%
group_by(row) %>%
mutate(nn=lead(src), en=last(src)) %>%
ungroup() %>%
filter(!is.na(nn)) %>%
arrange(row) %>%
select(src, nn, en)
## A tibble: 10 x 3
# src nn en
# <chr> <chr> <chr>
# 1 A B C
# 2 B C C
# 3 P Q S
# 4 Q R S
# 5 R S S
# 6 H I M
# 7 I J M
# 8 J K M
# 9 K L M
#10 L M M
Или как в базе R:
tmp <- na.omit(data.frame(row=seq_len(nrow(dat)), src=unlist(dat), stringsAsFactors=FALSE))
tmp$nn <- ave(tmp$src, tmp$row, FUN=function(x) c(tail(x,-1),NA) )
tmp$en <- ave(tmp$src, tmp$row, FUN=function(x) tail(x,1) )
tmp <- tmp[!is.na(tmp$nn),]
tmp[order(tmp$row), c("src","nn","en")]
# src nn en
#src1 A B C
#hop11 B C C
#src2 P Q S
#hop12 Q R S
#hop22 R S S
#src3 H I M
#hop13 I J M
#hop23 J K M
#hop33 K L M
#hop43 L M M
Где dat
было:
dat <- read.table(text="src hop1 hop2 hop3 hop4 destination
A B C NA NA NA
P Q R S NA NA
H I J K L M", header=TRUE, stringsAsFactors=FALSE)