我有以下数据示例:
A<-rnorm(100)
B<-rnorm(100)
C<-rnorm(100)
v1<-as.numeric(c(1:100))
v2<-as.numeric(c(2:101))
v3<-as.numeric(c(3:102))
v2[50]<-NA
v3[60]<-NA
v3[61]<-NA
df<-data.frame(A,B,C,v1,v2,v3)
正如您所见,df在第5列中有1个NA,在第6列中有2个NA。 现在我想一方面建立col1和3的相关矩阵,另一方面建立col2,4,5,6。在R中使用cor函数:
cor(df[ , c(1,3)], df[ , c(2,4,5,6)], use="complete.obs")
# B v1 v2 v3
# A -0.007565203 -0.2985090 -0.2985090 -0.2985090
# C 0.032485874 0.1043763 0.1043763 0.1043763
这很有效。然而,我想要估计和p.value,因此我切换到cor.test。
cor.test(df[ ,c(1,3)], df[ , c(2,4,5,6)], na.action = "na.exclude")$estimate
这不起作用,因为'x'和'y'必须具有相同的长度。 实际上,无论数据中是否存在NA,都会发生此错误。似乎cor.test不理解(与cor不同)关联特定列的请求。有没有解决这个问题的方法?
答案 0 :(得分:3)
您可以使用X
在所有列对之间执行测试。此处Y
和df
是从outer(df[, c(1,3)], df[, c(2,4,5,6)], function(X, Y){
mapply(function(...) cor.test(..., na.action = "na.exclude")$estimate,
X, Y)
})
扩展而来的数据框,每个数据框由8列组成。
cor
您甚至可以在与 B v1 v2 v3
A 0.07844426 0.01829566 0.01931412 0.01528329
C 0.11487140 -0.14827859 -0.14900301 -0.15534569
相同的表单上获得输出:
<?php
$first_array = array(...);
$second_array = array(...);
// Anonymous function to extract the IDskills from the second array:
$get_IDs = function($element) {
return($element->IDskill);
};
// Array of (just) IDskills of the second array:
$IDs = array_map($get_IDs, array_filter($second_array, function($element) {
// Anonymous function to filter $second_array elements without IDskill:
return(isset($element->IDskill));
}));
// Another anonymous function that returns a new array with elements from
// $first_array with the new MATCH property.
// use(&$IDs) makes $IDs available inside the function scope:
$check_match = function($element) use(&$IDs) {
// We use clone because we don't want to modify the original array values:
$match_element = clone $element;
if(isset($match_element->ID))
$match_element->MATCH = in_array($match_element->ID, $IDs);
else
$match_element->MATCH = false;
return($match_element);
};
$match = array_map($check_match, $first_array);
?>