2016-07-28 42 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][]