[英]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
或者我们可以将which
与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
如果我们需要使用dplyr
,则rowwise
的do
可以得到预期的输出
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.