根据特定行的值在数据框列表中创建 TRUE/FALSE 列
Create TRUE/FALSE column in a list of dataframes based on values of specific rows
我有一个数据框列表,其中包含来自不同 'null' 和 'alternative' 统计模型的值。我想在每个数据框中创建一个新列,其中每行包含一个 TRUE 或 FALSE 值。所有 'null' 模型都应指定为 FALSE。所有 'alternative' 模型都应为 FALSE,其值小于具有最高值的空模型的两倍。但是任何至少两倍于最高空模型值的替代模型都应该是 TRUE。
因此,例如,如果我有两个值为 3 和 4 的替代模型,以及两个值为 1 和 2 的空模型,那么我希望一个替代模型(值 = 3)和2 个空模型。但是一个替代模型(值 = 4)应该为 TRUE,因为它是最高空模型值(值 = 2)的两倍。我在下面的 'Test' 示例中复制了这个。
我可以针对单个数据帧('Test' 示例)实现此目的,但我不知道如何通过数据帧列表循环执行此操作。一些可重现的代码:
####Data import
M1 <- data.frame(matrix(1:4, nrow = 4, ncol = 1))
M2 <- data.frame(matrix(8:11, nrow = 4, ncol = 1))
M3 <- data.frame(matrix(0:3, nrow = 4, ncol = 1))
mlist <- list(M1, M2, M3)
mlist <- lapply(mlist, transform, Logical= NA)##CREATE NEW COLUMN FOR EACH DF
###Define models
row_names <- c("NULL1","NULL2","ALT1","ALT2")
mlist <- lapply(mlist, "rownames<-", row_names)
虽然我不确定从这里开始做什么。这是我将对单个数据帧采用的过程。
###Perform for one DF individually
Test <- mlist[[1]]
null_models<-which(rownames(Test)=="NULL1" | rownames(Test)== "NULL2")
for (i in 1:nrow(Test)){
if (all(Test[null_models,1]<=(Test[i,1]/2))) {
Test$Logical[i]<-"TRUE"
} else {
Test$Logical[i]<-"FALSE"
}}
Test
但我不知道如何在数据帧列表中应用此代码。预先感谢您对此提供的任何帮助。
你快到了。将您的代码包装在一个接受一个参数(列表元素)的函数中。
customFunction <- function(x) {
Test <- x
null_models <- which(rownames(Test) == "NULL1" | rownames(Test) == "NULL2")
for (i in 1:nrow(Test)){
if (all(Test[null_models, 1]<=(Test[i,1]/2))) {
Test$Logical[i]<-"TRUE"
} else {
Test$Logical[i]<-"FALSE"
}}
Test
}
> lapply(mlist, FUN = customFunction)
[[1]]
matrix.1.4..nrow...4..ncol...1. Logical
NULL1 1 FALSE
NULL2 2 FALSE
ALT1 3 FALSE
ALT2 4 TRUE
[[2]]
matrix.8.11..nrow...4..ncol...1. Logical
NULL1 8 FALSE
NULL2 9 FALSE
ALT1 10 FALSE
ALT2 11 FALSE
[[3]]
matrix.0.3..nrow...4..ncol...1. Logical
NULL1 0 FALSE
NULL2 1 FALSE
ALT1 2 TRUE
ALT2 3 TRUE
这是内部循环的一个简短变体:
for (i in 1:nrow(Test)) Test$Logical[i] <- all(Test[null_models,1]<=(Test[i,1]/2))
也可以用 apply()
调用替换循环(即循环隐藏):
T0 <- Test[null_models,1]
Test$Logical <- apply(T0 <= matrix(Test[,1]/2, length(null_models), nrow(Test), byrow = TRUE), 2, all)
或
Test$Logical <- apply(sapply(Test[null_models,1], '<=', Test[,1]/2), 1, all)
我有一个数据框列表,其中包含来自不同 'null' 和 'alternative' 统计模型的值。我想在每个数据框中创建一个新列,其中每行包含一个 TRUE 或 FALSE 值。所有 'null' 模型都应指定为 FALSE。所有 'alternative' 模型都应为 FALSE,其值小于具有最高值的空模型的两倍。但是任何至少两倍于最高空模型值的替代模型都应该是 TRUE。
因此,例如,如果我有两个值为 3 和 4 的替代模型,以及两个值为 1 和 2 的空模型,那么我希望一个替代模型(值 = 3)和2 个空模型。但是一个替代模型(值 = 4)应该为 TRUE,因为它是最高空模型值(值 = 2)的两倍。我在下面的 'Test' 示例中复制了这个。
我可以针对单个数据帧('Test' 示例)实现此目的,但我不知道如何通过数据帧列表循环执行此操作。一些可重现的代码:
####Data import
M1 <- data.frame(matrix(1:4, nrow = 4, ncol = 1))
M2 <- data.frame(matrix(8:11, nrow = 4, ncol = 1))
M3 <- data.frame(matrix(0:3, nrow = 4, ncol = 1))
mlist <- list(M1, M2, M3)
mlist <- lapply(mlist, transform, Logical= NA)##CREATE NEW COLUMN FOR EACH DF
###Define models
row_names <- c("NULL1","NULL2","ALT1","ALT2")
mlist <- lapply(mlist, "rownames<-", row_names)
虽然我不确定从这里开始做什么。这是我将对单个数据帧采用的过程。
###Perform for one DF individually
Test <- mlist[[1]]
null_models<-which(rownames(Test)=="NULL1" | rownames(Test)== "NULL2")
for (i in 1:nrow(Test)){
if (all(Test[null_models,1]<=(Test[i,1]/2))) {
Test$Logical[i]<-"TRUE"
} else {
Test$Logical[i]<-"FALSE"
}}
Test
但我不知道如何在数据帧列表中应用此代码。预先感谢您对此提供的任何帮助。
你快到了。将您的代码包装在一个接受一个参数(列表元素)的函数中。
customFunction <- function(x) {
Test <- x
null_models <- which(rownames(Test) == "NULL1" | rownames(Test) == "NULL2")
for (i in 1:nrow(Test)){
if (all(Test[null_models, 1]<=(Test[i,1]/2))) {
Test$Logical[i]<-"TRUE"
} else {
Test$Logical[i]<-"FALSE"
}}
Test
}
> lapply(mlist, FUN = customFunction)
[[1]]
matrix.1.4..nrow...4..ncol...1. Logical
NULL1 1 FALSE
NULL2 2 FALSE
ALT1 3 FALSE
ALT2 4 TRUE
[[2]]
matrix.8.11..nrow...4..ncol...1. Logical
NULL1 8 FALSE
NULL2 9 FALSE
ALT1 10 FALSE
ALT2 11 FALSE
[[3]]
matrix.0.3..nrow...4..ncol...1. Logical
NULL1 0 FALSE
NULL2 1 FALSE
ALT1 2 TRUE
ALT2 3 TRUE
这是内部循环的一个简短变体:
for (i in 1:nrow(Test)) Test$Logical[i] <- all(Test[null_models,1]<=(Test[i,1]/2))
也可以用 apply()
调用替换循环(即循环隐藏):
T0 <- Test[null_models,1]
Test$Logical <- apply(T0 <= matrix(Test[,1]/2, length(null_models), nrow(Test), byrow = TRUE), 2, all)
或
Test$Logical <- apply(sapply(Test[null_models,1], '<=', Test[,1]/2), 1, all)