假设我有一个7列的数据框,其中一些行有7个值,而其他行有超过某个点的NAs。我想抓住不是NA的最后一个值(从左到右)然后直接到左边的值。它是分层数据,但有些组比其他组更深入。我想在新数据框中的两列中最深和最深的第二组。
此代码可以工作,但最大限度地提高了我对46K观测数据帧的记忆。是否有一种我没有想到的更有效的方式?
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]])))
第一次发帖。通常我可以从这个网站拼凑我需要的东西。提前谢谢。
答案 0 :(得分:3)
我认为您可以通过简单的apply
调用来保存运行该循环两次,例如:
> apply(df, 1, function(x) {
+ n <- max(which(!is.na(x)))
+ x[(n-1):n]
+ })
[,1] [,2] [,3]
[1,] "dog" "pepper" "mineral"
[2,] "westie" "jalepeno" "rock"
答案 1 :(得分:1)
我不确定你的代码会提供你认为应该如何穿过行的长度(尽管你说不应该发生这种情况)应该提供的内容。这段代码将在第一个NA之前停止并返回两个先前的价值观。
> output.m <- apply(df,1,function(x) { leng.na <-rle(is.na(x))$lengths[1]
tail(x[1:leng.na],2) } )
> output.d <- as.data.frame(t(output.m))
> output.d
V1 V2
1 dog westie
2 pepper jalepeno
3 mineral rock