перечислить количество data.frames для вывода функции R - PullRequest
1 голос
/ 10 мая 2019

Мне было интересно, как я мог получить свою функцию ниже для вывода списка length(n.x), data.frame с, с каждым data.frame, содержащим n.x[i] строк в нем.

x является вектором, а n.x определяет количество элементов, извлекаемых из x, а length(n.x) определяет количество отдельных наборов, которые станут data.frame с.

Например, если x = 1:5 и n.x = c(2, 3), я хочу, чтобы первые 2 элемента x (т.е. 1 и 2) стали одним data.frame, а последние 3 элемента x (т. Е. 3, 4, 5), чтобы стать другим data.frame. Затем я хочу, чтобы эти два data.frame были выведены в виде списка.

Обновление: Некоторые x могут иметь long= T, а некоторые long= F. После сохранения вызова как объекта (например, a), может ли пользователь использовать a$study1$long для извлечения x s, для которого long = T и a$study1$short для извлечения x s, для которого 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

1 Ответ

1 голос
/ 10 мая 2019

Мы можем использовать 'n.x', чтобы создать вектор группировки для split data.frame в list из data.frame s

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...