解释这有点奇怪。我有两个数据帧。第一个是参考,第二个可能有或没有缺失值。两个数据帧共享相同的变量。如果第二个数据帧中有NA,我想根据参考值创建一个新的数据帧,但删除那个丢失的变量。每个奇数和偶数变量都是相关的。因此,如果奇数变量具有NA值,则需要在新数据帧中删除该变量+下一个变量。如果存在具有NA值的偶数变量,则需要删除变量+前一个变量。因此var 1和var 2是相关的,var 3和var 4,var 5和var 6等。或多或少我有它工作,但我的代码有NULL值问题。
is.odd <- function(x) x %% 2 == 1
apply(new, 1, function(x) {
if(is.odd(which(is.na(x)))) {
toremove=c(which(is.na(x)), which(is.na(x))+1)
}
if(!is.odd(which(is.na(x)))) {
toremove=c(which(is.na(x)), which(is.na(x))-1)
}
ref[,!(1:ncol(ref) %in% toremove), drop=F]
})
我得到的错误是&#34;错误if(is.odd(which(is.na(x)))){:参数的长度为零&#34;。
这是我想要的一个例子。第一个是参考数据框:
var1 var2 var3 var4
1 q w e r
2 t y u i
3 o p a s
4 d f g h
第二个缺少NA值:
var1 var2 var3 var4
1 1 1 1 1
2 1 3 2 NA
3 1 NA a s
4 d f g h
第二个数据帧的每一行用于根据参考值创建新的数据帧。对于第一行,输出应该是完整的,因为没有NA:
var1 var2 var3 var4
1 q w e r
2 t y u i
3 o p a s
4 d f g h
对于第二行,输出应该缺少第3和第4个变量,因为第4行有一个NA而3 + 4(奇数+偶数)是相关的。 :
var1 var2
1 q w
2 t y
3 o p
4 d f
更新:我认为问题在于(is.na(x)返回数字(0)。我试图用以下方法控制:
if(!identical(which(is.na(x))), numeric(0)) {}
但它似乎并不匹配。
答案 0 :(得分:0)
我们可以尝试
apply(df2, 1, function(x) {if(all(!is.na(x)))
df1 else {
i1 <- which(is.na(x))
df1[-c(sapply(i1, function(i)
if(!i%%2) c(max(1, i-1), i)
else c(i, min(length(x), i+1))))]
}
}
)
#$`1`
# var1 var2 var3 var4
#1 q w e r
#2 t y u i
#3 o p a s
#4 d f g h
#$`2`
# var1 var2
#1 q w
#2 t y
#3 o p
#4 d f
#$`3`
# var3 var4
#1 e r
#2 u i
#3 a s
#4 g h
#$`4`
# var1 var2 var3 var4
#1 q w e r
#2 t y u i
#3 o p a s
#4 d f g h