Lapply 到 R 中的数据帧列表
Lapply to the list of data frames in R
> df1 <- data.frame(A = 1:10, B= 11:20)
> df2 <- data.frame(A = 21:30, B = 31:40)
> ddata <- list(df1,df2)
我的objective是对列表的每个数据帧执行A列和B列的关联。
即
cor (ddata[[1]]$A,ddata[[1]]$B)
cor (ddata[[2]]$A,ddata[[2]]$B)
为此我正在使用 lapply
但我做错了,请帮忙。
lapply(ddata, cor)
您的代码存在的问题是,当您对整个 data.frame
(所有数字列)调用 cor
时,它将 return 一个相关 矩阵,包含所有列的成对相关性 - 对角线上的值是相应列与其自身的相关性(始终等于 1.00)。这不会在您的示例数据中立即显现出来,因为您的两个 data.frame
为 cor(A,B) == cor(B,A) == cor(A,A) == cor(B,B) == 1
。这在以下示例中更清楚:
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
无论如何,我认为您正在寻找单个相关性 value 而不是相关性 matrix,这可以实现几个不同的方式 - 使用 x[,1]
& x[,2]
或 x[[1]]
& x[[2]]
访问 data.frame
的列。
此外,还有一个语法选项;一个导致相关标量值的方法,除了与上述两种情况不同的是,它保留了 matrix
class。这是使用 x[1]
& x[2]
访问列,因为单个括号(没有逗号)将产生一列 data.frame
。
出于您的目的,上面直接提到的 3 种方法中的任何一种都应该是可以接受的 - 只要您传递 cor
两个对象,无论它们是(原子)数字向量(案例 [, ]
和case [[ ]]
) 或 single column data.frame
s (case [ ]
) - 函数将计算为 cor(x, y, ...)
和 return 单个相关性 值 。前两种方法和第三种方法之间的(细微)区别是 return 值的 class - 前者为 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)
一个。结果类型是相关矩阵;结果 class 是 matrix
:
R> class(cor(df3)); cor(df3)
[1] "matrix"
A B
A 1.0000000 0.5776151
B 0.5776151 1.0000000
乙。结果类型是单个相关值;结果 class 是 matrix
:
R> class(cor(df3[1],df3[2])); cor(df3[1],df3[2])
[1] "matrix"
B
A 0.5776151
C。结果类型是单个相关值;结果 class 是 numeric
:
R> class(cor(df3[,1],df3[,2])); cor(df3[,1],df3[,2])
[1] "numeric"
[1] 0.5776151
D.结果类型是单个相关值;结果 class 是 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
}
而 运行 他们在对象上 dflist
给了我们
R> fA(dflist)
Element class: matrix
[[1]]
A B
A 1.0000000 0.5776151
B 0.5776151 1.0000000
[[2]]
A B
A 1.0000000 -0.1816951
B -0.1816951 1.0000000
##
R> fB(dflist)
Element class: matrix
[[1]]
B
A 0.5776151
[[2]]
B
A -0.1816951
##
R> fC(dflist)
Element class: numeric
[[1]]
[1] 0.5776151
[[2]]
[1] -0.1816951
##
R> fD(dflist)
Element class: numeric
[[1]]
[1] 0.5776151
[[2]]
[1] -0.1816951
> df1 <- data.frame(A = 1:10, B= 11:20)
> df2 <- data.frame(A = 21:30, B = 31:40)
> ddata <- list(df1,df2)
我的objective是对列表的每个数据帧执行A列和B列的关联。 即
cor (ddata[[1]]$A,ddata[[1]]$B)
cor (ddata[[2]]$A,ddata[[2]]$B)
为此我正在使用 lapply
但我做错了,请帮忙。
lapply(ddata, cor)
您的代码存在的问题是,当您对整个 data.frame
(所有数字列)调用 cor
时,它将 return 一个相关 矩阵,包含所有列的成对相关性 - 对角线上的值是相应列与其自身的相关性(始终等于 1.00)。这不会在您的示例数据中立即显现出来,因为您的两个 data.frame
为 cor(A,B) == cor(B,A) == cor(A,A) == cor(B,B) == 1
。这在以下示例中更清楚:
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
无论如何,我认为您正在寻找单个相关性 value 而不是相关性 matrix,这可以实现几个不同的方式 - 使用 x[,1]
& x[,2]
或 x[[1]]
& x[[2]]
访问 data.frame
的列。
此外,还有一个语法选项;一个导致相关标量值的方法,除了与上述两种情况不同的是,它保留了 matrix
class。这是使用 x[1]
& x[2]
访问列,因为单个括号(没有逗号)将产生一列 data.frame
。
出于您的目的,上面直接提到的 3 种方法中的任何一种都应该是可以接受的 - 只要您传递 cor
两个对象,无论它们是(原子)数字向量(案例 [, ]
和case [[ ]]
) 或 single column data.frame
s (case [ ]
) - 函数将计算为 cor(x, y, ...)
和 return 单个相关性 值 。前两种方法和第三种方法之间的(细微)区别是 return 值的 class - 前者为 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)
一个。结果类型是相关矩阵;结果 class 是 matrix
:
R> class(cor(df3)); cor(df3)
[1] "matrix"
A B
A 1.0000000 0.5776151
B 0.5776151 1.0000000
乙。结果类型是单个相关值;结果 class 是 matrix
:
R> class(cor(df3[1],df3[2])); cor(df3[1],df3[2])
[1] "matrix"
B
A 0.5776151
C。结果类型是单个相关值;结果 class 是 numeric
:
R> class(cor(df3[,1],df3[,2])); cor(df3[,1],df3[,2])
[1] "numeric"
[1] 0.5776151
D.结果类型是单个相关值;结果 class 是 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
}
而 运行 他们在对象上 dflist
给了我们
R> fA(dflist)
Element class: matrix
[[1]]
A B
A 1.0000000 0.5776151
B 0.5776151 1.0000000
[[2]]
A B
A 1.0000000 -0.1816951
B -0.1816951 1.0000000
##
R> fB(dflist)
Element class: matrix
[[1]]
B
A 0.5776151
[[2]]
B
A -0.1816951
##
R> fC(dflist)
Element class: numeric
[[1]]
[1] 0.5776151
[[2]]
[1] -0.1816951
##
R> fD(dflist)
Element class: numeric
[[1]]
[1] 0.5776151
[[2]]
[1] -0.1816951