Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于特定行的值在数据帧列表中创建TRUE/FALSE列_R_List_Loops_Dataframe_Logical Operators - Fatal编程技术网

基于特定行的值在数据帧列表中创建TRUE/FALSE列

基于特定行的值在数据帧列表中创建TRUE/FALSE列,r,list,loops,dataframe,logical-operators,R,List,Loops,Dataframe,Logical Operators,我有一个数据帧列表,其中包含来自不同“null”和“可选”统计模型的值。我想在每个dataframe中创建一个新列,其中包含每行的TRUE或FALSE值。所有“null”模型都应指定为FALSE。当其值小于具有最高值的空模型值的两倍时,所有“可选”模型都应为FALSE。但任何至少是最高空模型值两倍的替代模型都应该为真 例如,如果我有两个值分别为3和4的备选模型,以及两个值分别为1和2的空模型,那么我希望一个备选模型(值=3)和两个空模型的值为假。但有一个备选模型(值=4)应该为真,因为它是最高的

我有一个数据帧列表,其中包含来自不同“null”和“可选”统计模型的值。我想在每个dataframe中创建一个新列,其中包含每行的TRUE或FALSE值。所有“null”模型都应指定为FALSE。当其值小于具有最高值的空模型值的两倍时,所有“可选”模型都应为FALSE。但任何至少是最高空模型值两倍的替代模型都应该为真

例如,如果我有两个值分别为3和4的备选模型,以及两个值分别为1和2的空模型,那么我希望一个备选模型(值=3)和两个空模型的值为假。但有一个备选模型(值=4)应该为真,因为它是最高的空模型值(值=2)的两倍。我在下面的“测试”示例中复制了这一点

我可以在单个数据帧(“测试”示例)中实现这一点,但我不知道如何通过数据帧列表循环实现这一点。一些可复制的代码:

####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)
数据导入
M1你就快到了。将代码包装在一个只接受一个参数(list元素)的函数中


Test$Logical
Test$Logical[i]谢谢你的评论。但我的问题是在数据帧列表中同时应用此技术。例如,如何在mlist中执行此操作。@jogo请随意将此信息附加到我的答案中。
###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))
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)