【问题标题】:list a number of data.frames for the output of an R function列出 R 函数输出的一些 data.frames
【发布时间】:2019-05-10 02:08:01
【问题描述】:

我想知道如何让下面的函数输出length(n.x)data.frames 的列表,每个data.frame 中都有n.x[i] 行。

x是一个向量,n.x决定了要从x中提取的元素个数,length(n.x)决定了分离集合的个数变成data.frames。

例如,如果x = 1:5n.x = c(2, 3),我希望x 的前两个元素(即12)变成一个data.frame,并且最后三个元素x(即3, 4, 5)成为另一个data.frame。然后,我希望将这两个data.frame 输出为一个列表。

更新:一些xs 可以有一个long= T,还有一些long= F。将呼叫保存为对象(例如a)后,用户能否使用a$study1$long 提取xs 为long = Ta$study1$short 提取xs 为long = F ?

foo <- function(x, n.x, long) {

  a <- x 
  data.frame(a)
}

a <- foo(1:4, c(1, 2, 1), long = c(T, F, T, T) )

a$study1$short
a$study1$long

【问题讨论】:

    标签: r list function dataframe


    【解决方案1】:

    我们可以使用'n.x'创建一个分组向量,将split的data.frame转换成listdata.frames

    foo <- function(x, n.x, long) {
    
    
        d1 <- data.frame(a = x, long)
    
        lst1 <- split(d1, list(rep(seq_along(n.x), n.x), long), drop = TRUE)
        names(lst1) <- paste0("Study", seq_along(lst1))
        lst1 <- lapply(lst1, `row.names<-`, NULL)
        lapply(lst1, function(x) setNames(x, c("a", c("short", "long")[x$long[1] +1])))
    
       } 
    
    
    
    foo(1:4, c(1, 2, 1), c(TRUE, FALSE, TRUE, TRUE))
    #$Study1
    #  a short
    #1 2 FALSE
    
    #$Study2
    #  a long
    #1 1 TRUE
    
    #$Study3
    #  a long
    #1 3 TRUE
    
    #$Study4
    #  a long
    #1 4 TRUE
    

    如果我们需要再传递一个向量('nn')并将其分配为行名

    foo <- function(x, n.x, long, nn, rowName = "character") {
    
            nn <- if(rowName == "character") {
                      nn
                     } else as.integer(factor(nn))
    
    
            d1 <- data.frame(a = x, long)
            row.names(d1) <- nn
    
            lst1 <- split(d1, list(rep(seq_along(n.x), n.x), long), drop = TRUE)
            names(lst1) <- paste0("Study", seq_along(lst1))
            #lst1 <- lapply(lst1, `row.names<-`, NULL)
            lapply(lst1, function(x) 
                 setNames(x, c("a", c("short", "long")[x$long[1] +1])))
    
           } 
    
    nn <- c("bigi, gigi, cigi", "fifi") 
    nn1 <- unlist(strsplit(nn, ", "))
    foo(1:4, c(1, 2, 1), c(TRUE, FALSE, TRUE, TRUE), nn1, rowName = "integer")
    

    【讨论】:

    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2015-04-26
    • 2021-03-21
    • 2015-12-03
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多