Мне было интересно, как я могу заставить свою функцию ниже выводить список length(n.x), data.frames, где каждый data.frame имеет n.x[i] строк.
x — это вектор, а n.x определяет количество элементов, которые нужно извлечь из x, а length(n.x) определяет количество отдельных наборов, которые станут data.frames.
Например, если 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, для которых long = T и a$study1$short для извлечения x, для которых 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





Мы можем использовать «n.x», чтобы создать вектор группировки для split data.frame в list из data.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")
Комментарии не для расширенного обсуждения; этот разговор был перешел в чат.