2016-07-28 12 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) 

私は私に新しいデータを与えるためにNASとの最後から二番目の非空行テールを交換したいです

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との置き換えられるかは明らかではありません。例えば、第1列では3行と5行がNAであり、第2列では3行がNAである。 – akrun

+0

"最後から2番目の空でない行の尾"とはどういう意味ですか? –

+0

@akrunの場合、置換は行で行われ、列では行われません。元のデータフレームの第1行では、最後から2番目の非NA値は2であり、新しいデータフレームではNAに置き換えられることに注意してください。 2行目の場合、元のデータフレームの最後から2番目の値は4で、新しいデータフレームではNAに置き換えられます。今すぐパターンを取得しますか? – user1783739

答えて

2

rowwisedoと予想される出力を得ることができます私たちは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 

使用するか、我々はdplyrを、使用する必要がある場合、我々はarr.ind=TRUE

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

whichを使用することができます

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][] 
関連する問題