R 找到两个变量的成对完整数据的最简单方法是什么?
假设有两个变量都有一些缺失数据,但这些缺失数据可能不会完全重叠。找到没有缺失值的公共数据点数量的最简单方法是什么?有内置的功能吗 一种方法是创建如下函数:R 找到两个变量的成对完整数据的最简单方法是什么?,r,missing-data,R,Missing Data,假设有两个变量都有一些缺失数据,但这些缺失数据可能不会完全重叠。找到没有缺失值的公共数据点数量的最简单方法是什么?有内置的功能吗 一种方法是创建如下函数: pairwise.miss = function(x, y) { #deal with input types x = as.vector(x) y = as.vector(y) #make combined object c = cbind(x, y) #remove NA rows c = c[complete
pairwise.miss = function(x, y) {
#deal with input types
x = as.vector(x)
y = as.vector(y)
#make combined object
c = cbind(x, y)
#remove NA rows
c = c[complete.cases(c), ]
#return length
return(nrow(c))
}
另一个想法是使用一些返回成对完整数据的函数。例如,Hmisc
中的rcorr()
会执行此操作,但可能会为非数字数据提供错误。因此:
rcorr(x, y)$n[1,2]
有更简单的方法吗?一种可能的解决方案是使用
Is.na
和逻辑运算符:
!(is.na(x) | is.na(y)) # logical vector
which(!(is.na(x) | is.na(y))) # integer vector of indices.
如果只需要总计数,请使用:
sum(!(is.na(x) | is.na(y)))
一种可能的解决方案是使用
is.na
和逻辑运算符:
!(is.na(x) | is.na(y)) # logical vector
which(!(is.na(x) | is.na(y))) # integer vector of indices.
如果只需要总计数,请使用:
sum(!(is.na(x) | is.na(y)))
您只需在输出中列出
complete.cases()
和sum()
中的两个变量即可
x <- c(1, 2, 3, NA, NA, NA, 5)
y <- c(1, NA, 3, NA, 3, 2, NA)
complete.cases(x, y)
#[1] TRUE FALSE TRUE FALSE FALSE FALSE FALSE
sum(complete.cases(x, y))
#[1] 2
x您只需在输出中列出complete.cases()
和sum()
中的两个变量即可
x <- c(1, 2, 3, NA, NA, NA, 5)
y <- c(1, NA, 3, NA, 3, 2, NA)
complete.cases(x, y)
#[1] TRUE FALSE TRUE FALSE FALSE FALSE FALSE
sum(complete.cases(x, y))
#[1] 2
xI对上述解决方案进行了基准测试:
if (!require("pacman")) install.packages("pacman")
pacman::p_load(microbenchmark)
#fetch some data
x = iris[1] #from isis
y = iris[1]
x[sample(1:150, 50), ] = NA #random subset
y[sample(1:150, 50), ] = NA
#benchmark
times = microbenchmark(pairwise.function = pairwise.miss(x, y),
sum.is.na = sum(!is.na(x) & !is.na(y)),
sum.is.na2 = sum(!(is.na(x) | is.na(y))),
sum.complete.cases = sum(complete.cases(x, y)));times
结果:
> times
Unit: microseconds
expr min lq mean median uq max neval
pairwise.function 202.205 217.2935 244.31481 233.3150 253.8460 450.763 100
sum.is.na 75.594 78.5500 89.26383 80.5730 94.1035 248.558 100
sum.is.na2 74.662 77.6170 89.23899 80.5725 94.8825 167.676 100
sum.complete.cases 14.311 16.1770 18.77197 17.1105 17.7330 155.233 100
因此,与sum.complete.cases-one相比,我最初的方法非常慢
也许这种计算很少需要速度,但在同样容易使用的情况下,最好使用最有效的方法。我对上面给出的解决方案进行了基准测试:
if (!require("pacman")) install.packages("pacman")
pacman::p_load(microbenchmark)
#fetch some data
x = iris[1] #from isis
y = iris[1]
x[sample(1:150, 50), ] = NA #random subset
y[sample(1:150, 50), ] = NA
#benchmark
times = microbenchmark(pairwise.function = pairwise.miss(x, y),
sum.is.na = sum(!is.na(x) & !is.na(y)),
sum.is.na2 = sum(!(is.na(x) | is.na(y))),
sum.complete.cases = sum(complete.cases(x, y)));times
结果:
> times
Unit: microseconds
expr min lq mean median uq max neval
pairwise.function 202.205 217.2935 244.31481 233.3150 253.8460 450.763 100
sum.is.na 75.594 78.5500 89.26383 80.5730 94.1035 248.558 100
sum.is.na2 74.662 77.6170 89.23899 80.5725 94.8825 167.676 100
sum.complete.cases 14.311 16.1770 18.77197 17.1105 17.7330 155.233 100
因此,与sum.complete.cases-one相比,我最初的方法非常慢
也许在这种计算中很少需要速度,但当它同样易于使用时,我们最好使用最有效的方法。sum(!is.na(x)&!is.na(y))
sum(!is.na(x)&!is.na(y))