0

我有一个矩阵:

1 3  NA
1 2  0
1 7  2
1 5  NA
1 9 5
1 6  3
2 5  2
2 6  1
3 NA  4
4 2  9
...

我想为第一列中的每个数字选择那些元素,第二列中的对应值在其自己的第二列中具有 NA。

所以搜索将按照以下方式进行:

  1. 在第一列中查找数字:1。
  2. 检查第二列中的相应值:3,2,7,5,9,6...
  3. 在第一列中查找 3,2,7,5,9,6 并查看它们在第二列中是否有 NA

上述情况的结果将是:

>3 NA  4<

因为这是唯一在其第二行具有 NA 的值。

这就是我想要用文字做的事情:

  1. 查看第一列中的数字,我找到“1”。

  2. 1 在第二列中有什么数字:3,2,7,5,9,6

  3. 这些数字在它们自己的第二列中有 NA 吗?是的,3 有一个 NA

  4. 我希望它返回那些数字而不是行号。

  5. 结果将是原始矩阵的子集,其中包含满足条件的行。

这将是 matlab 等效项,其中 i 是第 1 列中的数字:

isnan(matrix(matrix(:,1)==i,2))==1) 
4

3 回答 3

2

使用by, 按列 1 组获取结果,假设dat是您的数据框

by(dat,dat$V1,FUN=function(x){
                  y <- dat[which(dat$V1 %in% x$V2),]
                  y[is.na(y$V2),]
})

dat$V1: 1
  V1 V2 V3
9  3 NA  4
-------------------------------------------------------------------------------- 
dat$V1: 2
[1] V1 V2 V3
<0 rows> (or 0-length row.names)
-------------------------------------------------------------------------------- 
dat$V1: 3
[1] V1 V2 V3
<0 rows> (or 0-length row.names)
-------------------------------------------------------------------------------- 
dat$V1: 4
[1] V1 V2 V3
<0 rows> (or 0-length row.names)

编辑

在这里,我尝试执行与 matlab 命令相同的功能:

这里 R 等价于 matlab

  isnan(matrix(matrix(:,1)==i,2))==1)   ## what is i here 

  is.na(dat[dat[dat[,1]==1,2],])        ## R equivalent , I set i =1

     V1    V2    V3
3 FALSE FALSE FALSE
2 FALSE FALSE FALSE
7 FALSE FALSE FALSE
5 FALSE FALSE FALSE
9 FALSE  TRUE FALSE
6 FALSE FALSE FALSE
于 2013-01-19T16:53:54.847 回答
2

希望这很容易阅读,因为它遵循您描述的步骤:

idx1 <- m[, 1L] == 1L
idx2 <- m[, 1L] %in% m[idx1, 2L]
idx3 <- idx2 & is.na(m[, 2L])
m[idx3, ]
# V1 V2 V3 
#  3 NA  4

它都是矢量化的并使用整数比较,所以它不应该非常慢。但是,如果它对您的需要来说太慢,您应该使用 adata.table并使用您的第一列作为键。

请注意,您不需要任何作业,因此如果您正在寻找单线:

m[is.na(m[, 2L]) & m[, 1L] %in% m[m[, 1L] == 1L, 2L], ]
# [1]  3 NA  4

(但肯定更难阅读和维护。)

于 2013-01-19T17:42:07.610 回答
0

我仍然不完全清楚你想要什么,但也许这会奏效?

m<-read.table(
textConnection("1 3  NA
1 2  0
1 7  2
1 5  NA
1 9 5
1 6  3
2 5  2
2 6  1
3 NA  4
4 2  9"))

do.call(rbind,lapply(split(m[,2],m[,1]),function(x) m[x[!is.na(x)][is.na(m[x[!is.na(x)],2])],]))

#   V1 V2 V3
# 1  3 NA  4

如果您提供了一个您想要多行的示例,那就更好了。

于 2013-01-19T16:47:07.873 回答