代码之家  ›  专栏  ›  技术社区  ›  James White

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

  •  0
  • James White  · 技术社区  · 7 年前

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

    我可以为单个数据帧(“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
    

    但我不知道如何在数据帧列表中应用此代码。提前感谢您对此的任何帮助。

    1 回复  |  直到 7 年前
        1
  •  1
  •   jogo    7 年前

    你就快到了。将代码包装在一个函数中,该函数只接受一个参数(list元素)。

    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)