dplyr如何在列排序顺序更改时插入NA值
当列值从dplyr如何在列排序顺序更改时插入NA值,r,sorting,if-statement,dplyr,R,Sorting,If Statement,Dplyr,当列值从递增顺序更改为混合顺序时,我试图找到一种插入NA值的简单方法。但如果在这个混合有序行之后逻辑上继续增加顺序,那么也可以保留这些行 如果所有行没有递增顺序,请将这些行值替换为NA。(指所有混合排序的行) 此外,任何可以在其行中保留排序序列至少5个数字的列都可以通过(可以将其行保留为包含有序部分的行)。否则,替换那些无法通过此逻辑的行 我最好使用dplyr执行此过程。我试着这么做,但没想到:( 这是一个相当牵强的解决方案……它适用于以前的输出,但不适用于当前的C5:它将在第一次匹配到一系列5
递增
顺序更改为混合顺序时,我试图找到一种插入NA
值的简单方法。但如果在这个混合有序行之后逻辑上继续增加顺序,那么也可以保留这些行
如果所有行没有递增顺序,请将这些行值替换为NA
。(指所有混合排序的行)
此外,任何可以在其行中保留排序序列至少5个数字的列都可以通过(可以将其行保留为包含有序部分的行)。否则,替换那些无法通过此逻辑的行
我最好使用dplyr
执行此过程。我试着这么做,但没想到:(
这是一个相当牵强的解决方案……它适用于以前的输出,但不适用于当前的C5:它将在第一次匹配到一系列5个连续递增的值之前删除任何值
lag
进行比较。使用rle
查找序列5length=length(var)
C1=c(1:10,7,8,11,12)
C2=c(2:12,7,13,12)
种子集(123)
C3=样品(1:14)
C4=c(1:14)
种子集(456)
C5=c(样品(1:9),5,6,7,8,10)
dt为什么dt$C5[1]
变成了NA
?我本来以为1会留在那里。(这不是我唯一不明白的事,我通过了)@Tensibai通过意味着如果至少5行可以在该C5列显示递增顺序序列,那么可以保留它们。其他行应该是NA
,所以你只能保持5个连续的块(增加)行?很抱歉,您的预期输出很难与输入匹配,逻辑也不清楚me@Tensibai如果是这样的话,如果逻辑顺序发生了变化,你能至少给出一个答案吗?你应该修正关于你输入的预期输出。正如我所理解的,你的问题C5行应该是c(1,NA,2,NA,NA,NA,3,5,6,NA,NA,NA,7,8,10)或者可能是c(1,NA,2,NA,NA,NA,NA,NA,3,NA,NA,NA,5,6,7,8,10)或者是一整晚我都不知道该选哪一个exactly@scoa谢谢你花时间和精力写这么复杂的代码。顺便问一下,你怎么能写下这种我做不到的逻辑流程?你有学习的建议书或wep页面吗?@scoa,如果我想把这个co
函数推广到decreas如果要更改顺序,您需要在每次将v
与lag(v)
或var
Tolag(var)
var[p]>lag(var[p])
变为var[p]
,等等。是的。如果整个语句在一行中,则可以省略括号
dt_new <- dt%>%
mutate_each(funs(replace(., which(ifelse(.....
set.seed(123)
C1 = c(1:10,7,8,11,12)
C2 = c(2:12,7,13,12)
C3 = sample(1:14)
C4 = c(1:14)
C5 = c(sample(1:9),5,6,7,8,10)
dt <- data.frame(C1,C2,C3,C4,C5)
C1 C2 C3 C4 C5
# 1 1 2 5 1 1
# 2 2 3 11 2 8
# 3 3 4 14 3 2
# 4 4 5 10 4 9
# 5 5 6 13 5 7
# 6 6 7 1 6 4
# 7 7 8 12 7 3
# 8 8 9 7 8 5
# 9 9 10 4 9 6
# 10 10 11 3 10 5
# 11 7 12 6 11 6
# 12 8 7 2 12 7
# 13 11 13 2 13 8
# 14 12 12 9 14 10
C1 C2 C3 C4 C5
# 1 1 2 NA 1 1
# 2 2 3 NA 2 NA
# 3 3 4 NA 3 2
# 4 4 5 NA 4 NA
# 5 5 6 NA 5 NA
# 6 6 7 NA 6 NA
# 7 7 8 NA 7 3
# 8 8 9 NA 8 NA
# 9 9 10 NA 9 NA
# 10 10 11 NA 10 5
# 11 NA 12 NA 11 6
# 12 NA NA NA 12 7
# 13 11 13 NA 13 8
# 14 12 NA NA 14 9
library(dplyr)
library(zoo)
co <- function(var){
r <- rle(lag(var) < var)
d <- data.frame(v=r$values,
l=r$lengths,
c=cumsum(r$lengths))
idx <- which(d$l > 3 & d$v==TRUE)[1] - 1
id <- d$c[idx]
v <- rep(NA,length(var))
if(!is.na(id)) {
p <- id:length(v)
v[p] <- ifelse(var[p] > lag(var[p]),
var[p],
NA)
v[id] <- var[id]
previous.na <- sum(is.na(lag(v[p])))
if(previous.na > 1) {
current.na <- 0
while(current.na != previous.na)
{
previous.na <- sum(is.na(v))
v[p][is.na(lag(v[p]))][-1] <- ifelse(v[p][is.na(lag(v[p]))][-1] > lag(na.locf(v[p]))[is.na(lag(v[p]))][-1],
v[p][is.na(lag(v[p]))][-1],
NA)
v[id] <- var[id]
current.na <- sum(is.na(v))
}
}
}
print(var)
return(v)
}
mutate_each(dt,funs = funs(co))
C1 C2 C3 C4 C5
1 1 2 NA 1 NA
2 2 3 NA 2 NA
3 3 4 NA 3 NA
4 4 5 NA 4 NA
5 5 6 NA 5 NA
6 6 7 NA 6 NA
7 7 8 NA 7 NA
8 8 9 NA 8 NA
9 9 10 NA 9 NA
10 10 11 NA 10 5
11 NA 12 NA 11 6
12 NA NA NA 12 7
13 11 13 NA 13 8
14 12 NA NA 14 10
C1 = c(1:10,7,8,11,12)
C2 = c(2:12,7,13,12)
set.seed(123)
C3 = sample(1:14)
C4 = c(1:14)
set.seed(456)
C5 = c(sample(1:9),5,6,7,8,10)
dt <- data.frame(C1,C2,C3,C4,C5)