对于一个向量,确定所有值都是NA(或某个值)的索引
因此,我有调查数据,我想解决调查的多个管理问题(计算机失败,浏览器关闭以及人员重新启动)。说我有案件X1和X2,由同一人的顺序进行(在这里,已经退出了作为载体)对于一个向量,确定所有值都是NA(或某个值)的索引
x1 <- c(1:35, rep(NA, 65))
x2 <- c(-1:-95, rep(NA, 5))
既然我能知道发生X1首先,我要确定X1第一NA过去所有更多的条目都是NA(位置36),所以我可以合并这些案例来生成仅代表第一印象的数据。
我想找到一个函数,它将使我能够做到这一点:
n <- {function that computes this value}
x <- c(x1[1:(n-1)], x2[n:length(x2)])
导致此输出等同于:
c(1:35, -36:-95, rep(NA, 5))
像length(na.omit(x1)) + 1
方法是行不通的,因为有可能是NA在结束点之前,扰乱索引。举例来说,它仍然需要找到索引36如果
x1 <- c(1:12, NA, 13:35, rep(NA, 65))
97%需要此为NA的只是工作,而是一个通用的解决方案将是巨大的,太(即的东西,也可以匹配“”什么类似的,如果需要的话)。
你几乎是自己解决了查询。试试这个请
x3 <- c(x1[1:(head(which(is.na(x1)),1) - 1)], x2[head(which(is.na(x1)),1):length(x2)])
我希望你可以转换它的功能。从你的问题
数据
x1 <- c(1:35, rep(NA, 65))
x2 <- c(-1:-95, rep(NA, 5))
n <- max(which(diff(is.na(x1)) == 1))
c(x1[1:n-1], x2[n:length(x2)])
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# [24] 24 25 26 27 28 29 30 31 32 33 34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46
# [47] -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69
# [70] -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92
# [93] -93 -94 -95 NA NA NA NA NA
另一个实施例:在使用游程长度编码
x1 <- c(1:35, rep(NA, 35), 1:20, rep(NA, 10))
x2 <- c(-1:-95, rep(NA, 5))
n <- max(which(diff(is.na(x1)) == 1))
c(x1[1:n-1], x2[n:length(x2)])
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# [24] 24 25 26 27 28 29 30 31 32 33 34 35 NA NA NA NA NA NA NA NA NA NA NA
# [47] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
# [70] NA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 -90 -91 -92
# [93] -93 -94 -95 NA NA NA NA NA
在那里基本功能的巧妙链接。 +1给你,可能还有奖励,尽管我会稍微留意一下,看看是否有其他解决方案出现。 – Joe
@Joe - 我不明白这是如何匹配你所需要的输出?准确地说是 – SymbolixAU
。 @Joe请更新您的原始查询。现在有点混乱。 – Zico
n <- with(rle(is.na(x1)), lengths[length(lengths) -1 ] + 1)
x <- c(x1[1:(n-1)], x2[n:length(x2)])
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
# [30] 30 31 32 33 34 35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58
# [59] -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87
# [88] -88 -89 -90 -91 -92 -93 -94 -95 NA NA NA NA NA
作为rle
给出游程的长度NA
(或任何你指定的)。而且,你要使用的最后这些运行的,所以我们可以挑选上次运行
> rle(is.na(x1))
Run Length Encoding
lengths: int [1:2] 35 65
values : logi [1:2] FALSE TRUE
这可以用一个非常简单的ifelse
可以解决的起点:
x3 = ifelse(is.na(x1),x2,x1)
结果:
> x3
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13
[14] 14 15 16 17 18 19 20 21 22 23 24 25 26
[27] 27 28 29 30 31 32 33 34 35 -36 -37 -38 -39
[40] -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52
[53] -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65
[66] -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78
[79] -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91
[92] -92 -93 -94 -95 NA NA NA NA NA
如果您在x1中的最后一个有效条目之前没有NA,则可以使用此功能。如果是这种情况,以前的NA可能意味着用户跳过了这个问题。如果你想保持内部X1以前来港定居,这样做:
lastValidX1 = max(which(!is.na(x1)))
x3 = c(x1[1:lastValidX1] , x2[(lastValidX1+1):length(x2)])
例子:
x1 <- c(1:19,NA,21:35, rep(NA, 65))
x2 <- c(-1:-95, rep(NA, 5))
lastValidX1 = max(which(!is.na(x1)))
x3 = c(x1[1:lastValidX1] , x2[(lastValidX1+1):length(x2)])
> x3
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13
[14] 14 15 16 17 18 19 NA 21 22 23 24 25 26
[27] 27 28 29 30 31 32 33 34 35 -36 -37 -38 -39
[40] -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52
[53] -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65
[66] -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78
[79] -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91
[92] -92 -93 -94 -95 NA NA NA NA NA
> lastValidX1
[1] 35
我认为这不会解决“我想确定x1过去的所有更多条目都是NA(位置36)的第一个NA”位 – SymbolixAU
如果用户被允许跳过问题(NA之间的有效答案),如何您是否知道用户在上次有效输入后没有跳过一个或多个答案? –
对不起,但这只是发现的第一个NA,这正如我所说是不是目标。如果x1是 x1 Joe
@Joe你在查询中写道:“鉴于我可以先知道x1,我想确定x1中的第一个NA,其中所有更多的条目都是NA(位置36),所以我可以组合这些个案来生成数据表示只有第一印象。 ''你的'样本输出'也不反映你当前的查询。你能否请更新你的'样品输出' – Zico
我可以看到我的溶液正在工作 – Zico