繁体   English   中英

用R中的NA替换倒数第二个非空行尾

[英]Replace penultimate non-empty row tail with NA in 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)

我的问题是现在如何将其更改为NA。

我们可以使用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][]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM