首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将缺失的值压缩到向量中

如何将缺失的值压缩到向量中
EN

Stack Overflow用户
提问于 2014-05-01 21:25:45
回答 3查看 176关注 0票数 6

让我尽量使这个问题尽可能笼统。

假设我有两个变量a和b。

代码语言:javascript
复制
a <- as.integer(runif(20, min = 0, max = 10))
a <- as.data.frame(a)
b <- as.data.frame(a[c(-7, -11, -15),])

所以b有17个观测值,是a的一个子集,其中有20个观测值。

我的问题是:我将如何使用这两个变量生成第三个变量c,它像a一样有20个观测值,但缺少观测值7、11和15,而其他观测值与b相同,但按a的顺序排列。

或者换个说法:我如何把这些缺失的观测结果挤进位置7、11和15的变量b中呢?

这看起来很简单(而且很可能是这样),但我已经很久没有让它起作用了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-01 21:42:43

1)循环尝试这个循环:

代码语言:javascript
复制
# test data
set.seed(123) # for reproducibility
a <- as.integer(runif(20, min = 0, max = 10))
a <- as.data.frame(a)
b <- as.data.frame(a[c(-7, -11, -15),])

# lets work with vectors
A <- a[[1]]
B <- b[[1]]

j <- 1
C <- A
for(i in seq_along(A)) if (A[i] == B[j]) j <- j+1 else C[i] <- NA

这意味着:

代码语言:javascript
复制
> C
 [1]  2  7  4  8  9  0 NA  8  5  4 NA  4  6  5 NA  8  2  0  3  9

2) Reduce,这里是一个没有循环的版本:

代码语言:javascript
复制
f <- function(j, a) j + (a == B[j])
r <- Reduce(f, A, acc = TRUE)
ifelse(duplicated(r), NA, A)

给予:

代码语言:javascript
复制
[1]  2  7  4  8  9  0 NA  8  5  4 NA  4  6  5 NA  8  2  0  3  9

3) dtw。在同名的包中使用dtw,我们可以得到一个紧凑的、没有循环的一行程序:

代码语言:javascript
复制
library(dtw)

ifelse(duplicated(dtw(A, B)$index2), NA, A)

给予:

代码语言:javascript
复制
[1]  2  7  4  8  9  0 NA  8  5  4 NA  4  6  5 NA  8  2  0  3  9

修订了,增加了更多的解决方案。

票数 5
EN

Stack Overflow用户

发布于 2014-05-01 22:30:46

下面是一种更复杂的方法,使用Levenshtein距离算法,在更复杂的例子中做得更好(在我尝试过的几个更大的测试中,它看起来也更快):

代码语言:javascript
复制
# using same data as G. Grothendieck:
set.seed(123) # for reproducibility
a <- as.integer(runif(20, min = 0, max = 10))
a <- as.data.frame(a)
b <- as.data.frame(a[c(-7, -11, -15),])
A = a[[1]]
B = b[[1]]

# compute the transformation between the two, assigning infinite weight to 
# insertion and substitution
# using +1 here because the integers fed to intToUtf8 have to be larger than 0
# could also adjust the range more dynamically based on A and B
transf = attr(adist(intToUtf8(A+1), intToUtf8(B+1),
                    costs = c(Inf,1,Inf), counts = TRUE), 'trafos')

C = A
C[substring(transf, 1:nchar(transf), 1:nchar(transf)) == "D"] <- NA
#[1]  2  7  4  8  9  0 NA  8  5  4 NA  4  6  5 NA  8  2  0  3  9

更复杂的匹配示例(贪婪的算法执行得不好):

代码语言:javascript
复制
A = c(1,1,2,2,1,1,1,2,2,2)
B = c(1,1,1,2,2,2)

transf = attr(adist(intToUtf8(A), intToUtf8(B),
                    costs = c(Inf,1,Inf), counts = TRUE), 'trafos')

C = A
C[substring(transf, 1:nchar(transf), 1:nchar(transf)) == "D"] <- NA
#[1] NA NA NA NA  1  1  1  2  2  2

# the greedy algorithm would return this instead:
#[1]  1  1 NA NA  1 NA NA  2  2  2
票数 3
EN

Stack Overflow用户

发布于 2014-05-01 21:49:07

数据帧版本,与上面的G没有太大的不同。(假设a,b设置如上)。

代码语言:javascript
复制
j <- 1
c <- a
for (i in (seq_along(a[,1]))) {
    if (a[i,1]==b[j,1]) {
        j <- j+1
        } else 
        {
        c[i,1] <- NA
        }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23416899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档