Скажем, у меня есть фрейм данных из 7 столбцов, в некоторых строках есть 7 значений, а в других - NA после определенной точки. Я хочу получить последнее значение (слева направо), которое не является NA, а затем значение непосредственно слева. Это иерархические данные, но некоторые группы идут глубже, чем другие. Мне нужны самые глубокие и вторые самые глубокие группы в двух столбцах в новом фрейме данных.
Этот код работает, но мне не хватает памяти для кадра данных из 46 000 наблюдений. Есть ли более эффективный способ, о котором я не думаю?
df <- data.frame(LEVEL1 = c('animal', 'vegetable', 'mineral'),
LEVEL2 = c('mammal', 'pepper', 'rock'),
LEVEL3 = c('dog', 'jalepeno', NA),
LEVEL4 = c('westie', NA, NA))
deepest <- apply(df, 1,
function(x) length(which(!is.na(x))))
one.up <- apply(df, 1,
function(x) length(which(!is.na(x)))-1)
len <- nrow(df)
output <- data.frame(one.up = unlist(sapply(1:len,
function(x) df[x, one.up[x]])),
deepest= unlist(sapply(1:len,
function(x) df[x, deepest[x]])))
Первый раз публикую. Обычно я могу собрать то, что мне нужно, на этом сайте. Заранее спасибо.