2016-07-28 98 views
1

我有一个看起来像这样的数据帧:替换倒数第二个非空行尾与NA R中

df <- read.table(tc <- textConnection(" 
var1 var2 var3 var4 
1  2  7  NA 
4  4  NA  6 
2  NA  3  NA     
4  4  4  4    
1  3  NA  NA"), header = TRUE); close(tc) 

我想的NA替换倒数第二个非空行的尾巴给我一个新的数据框,看起来像这样:

df <- read.table(tc <- textConnection(" 
var1 var2 var3 var4 
1  NA  7  NA 
4  NA  NA  6 
NA  NA  3  NA     
4  4  NA  4    
NA  3  NA  NA"), header = TRUE); close(tc) 

我能使用的语句来识别倒数第二个非空行尾的位置:

penultimate <- function(x) head(tail(x[!is.na(x)], 2),1) 

我的问题是如何将这些更改为NAs。

+0

的值是如何为NAS取代目前尚不清楚。例如,在第一列中,3行和5行是NA,第二行中是3行。 – akrun

+0

您能否详细说明“倒数第二个非空行尾”是什么意思? –

+0

@akrun,替换是由行而不是列完成的。请注意,在原始数据帧的第一行中,倒数第二个非NA值为2,现在在新数据帧中用NA替换。对于第二行,原始数据帧中的倒数第二个值是4,现在在新数据帧中用NA代替。现在获取模式? – user1783739

回答

2

我们可以使用apply

penultimate <- function(x) replace(x, head(tail(which(!is.na(x)), 2),1), NA) 
t(apply(df, 1, penultimate)) 
#  var1 var2 var3 var4 
#[1,] 1 NA 7 NA 
#[2,] 4 NA NA 6 
#[3,] NA NA 3 NA 
#[4,] 4 4 NA 4 
#[5,] NA 3 NA NA 

或者我们可以使用whicharr.ind=TRUE

i1 <- which(!is.na(df), arr.ind=TRUE) 
df[i1[!!ave(i1[,2], i1[,1], FUN = function(x) rank(-x)==2),]] <- NA 

如果我们需要使用dplyr,该rowwisedo可以得到预期的输出

library(dplyr) 
df %>% 
    rowwise() %>% 
    do(data.frame(t(penultimate(unlist(.))))) 
# var1 var2 var3 var4 
# <int> <int> <int> <int> 
#1  1 NA  7 NA 
#2  4 NA NA  6 
#3 NA NA  3 NA 
#4  4  4 NA  4 
#5 NA  3 NA NA 

或者使用data.table

library(data.table) 
setDT(df)[, as.list(penultimate(unlist(.SD))), .(rn= 1:nrow(df))][, rn := NULL][]