提供给R中的数据框列表

时间:2015-01-14 21:00:24

标签: r list dataframe lapply

> df1 <- data.frame(A = 1:10, B= 11:20)
> df2 <- data.frame(A = 21:30, B = 31:40)
> ddata <- list(df1,df2)

我的目标是对列表的每个数据帧执行A列和B列的关联。 即

cor (ddata[[1]]$A,ddata[[1]]$B)
cor (ddata[[2]]$A,ddata[[2]]$B)

为此我使用lapply,但我做错了,请帮助。

lapply(ddata, cor)

1 个答案:

答案 0 :(得分:3)

您的代码存在的问题是,当您在整个cor(所有数字列)中调用data.frame时,它将返回相关矩阵,其中包含成对所有列的相关性 - 对角线上的值是相应列与其自身的相关性(总是等于1.00)。对于您的两个cor(A,B) == cor(B,A) == cor(A,A) == cor(B,B) == 1,您的示例数据不会立即显现,因为data.frame。在以下示例中更清楚:

df5 <- data.frame(A=rnorm(10),B=rnorm(10),C=rnorm(10))
R> cor(df5)
           A           B          C
A 1.00000000  0.05131293  0.6173047
B 0.05131293  1.00000000 -0.1312331
C 0.61730466 -0.13123314  1.0000000

无论如何,我认为您正在寻找单个关联而不是关联矩阵,这可以通过几种不同的方式实现 - 访问{{1 }}的列使用data.frame&amp; x[,1]或使用x[,2]&amp; x[[1]]

此外,还有另一种语法选项;一个导致相关的标量值,除了上述两种情况之外,它保留x[[2]]类。这是使用matrix&amp; x[1],因为单个括号(没有逗号)将产生一列x[2]

出于您的目的,上面直接提到的3种方法中的任何一种都应该是可接受的 - 只要你传递data.frame两个对象,无论它们是(原子)数字向量(case cor和case { {1}})或单个[, ] s(案例[[ ]]) - 该函数将评估为data.frame并返回单个关联值< / em>的。前两个方法和第三个方法之间的(细微)差异是返回值的类 - 前者的[ ](原子),后者的cor(x, y, ...) - 但这很可能是大局中无关紧要的细节。


让我用几个例子总结一下,使用这些数据:

numeric

一个。结果类型是相关矩阵;结果类是matrix

set.seed(123)
df3 <- data.frame(
  A=rnorm(10),
  B=rnorm(10))
##
set.seed(321)
df4 <- data.frame(
  A=rnorm(10),
  B=rnorm(10))
##
dflist <- list(df3,df4)

B中。结果类型是单个相关值;结果类是matrix

R> class(cor(df3)); cor(df3)
[1] "matrix"
          A         B
A 1.0000000 0.5776151
B 0.5776151 1.0000000

℃。结果类型是单个相关值;结果类是matrix

R> class(cor(df3[1],df3[2])); cor(df3[1],df3[2])
[1] "matrix"
          B
A 0.5776151

d。结果类型是单个相关值;结果类是numeric

R> class(cor(df3[,1],df3[,2])); cor(df3[,1],df3[,2])
[1] "numeric"
[1] 0.5776151

同样,以下四个函数numeric - R> class(cor(df3[[1]],df3[[2]])); cor(df3[[1]],df3[[2]]) [1] "numeric" [1] 0.5776151 对应于上述案例fA - fD

A

在对象D上运行它们会给我们

fA <- function(y) {
  res <- lapply(y,cor)
  message(paste0("Element class: ",class(res[[1]])))
  res
}
##
fB <- function(y) {
  res <- lapply(y, function(x) {
    cor(x[1],x[2])
  })
  message(paste0("Element class: ",class(res[[1]])))
  res
}
##
fC <- function(y) {
  res <- lapply(y, function(x) {
    cor(x[,1],x[,2])
  })
  message(paste0("Element class: ",class(res[[1]])))
  res
}
##
fD <- function(y) {
  res <- lapply(y, function(x) {
    cor(x[[1]],x[[2]])
  })
  message(paste0("Element class: ",class(res[[1]])))
  res
}