2017-02-23 51 views
2

因此,我有调查数据,我想解决调查的多个管理问题(计算机失败,浏览器关闭以及人员重新启动)。说我有案件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的只是工作,而是一个通用的解决方案将是巨大的,太(即的东西,也可以匹配“”什么类似的,如果需要的话)。

回答

0

你几乎是自己解决了查询。试试这个请

x3 <- c(x1[1:(head(which(is.na(x1)),1) - 1)], x2[head(which(is.na(x1)),1):length(x2)]) 

我希望你可以转换它的功能。从你的问题

+0

对不起,但这只是发现的第一个NA,这正如我所说是不是目标。如果x1是 x1 < - c(1:25,NA,27:35,rep(NA,65)) 这将完全不同。而长头()长时间不起作用,或者 - 我需要任意长度的NA(从某个点到最后)。 – Joe

+0

@Joe你在查询中写道:“鉴于我可以先知道x1,我想确定x1中的第一个NA,其中所有更多的条目都是NA(位置36),所以我可以组合这些个案来生成数据表示只有第一印象。 ''你的'样本输出'也不反映你当前的查询。你能否请更新你的'样品输出' – Zico

+0

我可以看到我的溶液正在工作 – Zico

1

数据

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 
+0

在那里基本功能的巧妙链接。 +1给你,可能还有奖励,尽管我会稍微留意一下,看看是否有其他解决方案出现。 – Joe

+0

@Joe - 我不明白这是如何匹配你所需要的输出?准确地说是 – SymbolixAU

+0

。 @Joe请更新您的原始查询。现在有点混乱。 – Zico

1

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 
0

这可以用一个非常简单的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 
+0

我认为这不会解决“我想确定x1过去的所有更多条目都是NA(位置36)的第一个NA”位 – SymbolixAU

+0

如果用户被允许跳过问题(NA之间的有效答案),如何您是否知道用户在上次有效输入后没有跳过一个或多个答案? –

相关问题