Мы можем сделать с apply
. Выполните цикл по строкам подмножества набора данных (без столбца «Дата») с помощью apply
(MARGIN
= 1), затем удалите элементы NA
(na.omit
), создайте data.frame
с этими элементами и «Xmin» в качестве имени столбца первого элемента, не являющегося NA, rbind
элементов и cbind
с первым столбцом
cbind(df1[1], do.call(rbind, apply(df1[-1], 1,
function(x) data.frame(setNames(as.list(na.omit(x)),
c("X1", "X2")), Xmin = sub("^X", "", names(na.omit(x)[1]))))))
данные
df1 <- structure(list(Date = c("2012-01-01", "2012-01-02", "2012-01-03",
"2012-01-04", "2012-01-05", "2012-01-06", "2012-01-07", "2012-01-08",
"2012-01-09", "2012-01-10", "2012-01-11", "2012-01-12", "2012-01-13",
"2012-01-14", "2012-01-15", "2012-01-16"), X10 = c(0.5, 0.3,
0.5, 0.3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), X20 = c(0.6,
0.2, 0.6, 0.2, 0.6, 0.2, 0.6, NA, NA, NA, NA, NA, NA, NA, NA,
NA), X30 = c(NA, NA, NA, NA, 0.4, 1.2, 1.6, 1.8, 2.1, 2.6, NA,
NA, NA, NA, NA, NA), X40 = c(NA, NA, NA, NA, NA, NA, NA, 2.4,
3.2, 3.3, 3.7, 3.9, 4.2, NA, NA, NA), X50 = c(NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, 5.1, 5.7, 5.6, 6.5, 6.9, 7.2), X60 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2.2, 2.9, 4.2
)), class = "data.frame", row.names = c(NA, -16L))