我有一个如下所示的数据框:
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。
答案 0 :(得分:2)
我们可以使用echo "bar" >> foo.txt
git add foo.txt
git commit -m "Add foo.txt"
git push origin master
git rm foo.txt
git commit -m "Remove foo.txt"
git push origin master
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