Вы можете использовать outer()
, но вам нужно векторизовать внутреннюю функцию:
X <- c("vijay","raj","joy")
Y <- c("maths","eng","science","social","hindi","physical","sanskrit")
set.seed(24)
marks <- data.frame(name = sample(X, 100, replace = TRUE),
subject = sample(Y, 100, replace = TRUE), stringsAsFactors = FALSE)
sset <- function(x,y) subset(marks, name == x & subject == y)
L <- outer(X, Y, FUN=Vectorize(sset, SIMPLIFY=FALSE))
L[1,1]
Объект L
представляет собой матрицу фреймов данных.
Вот еще одно решение с использованием двойного lapply()
:
L2 <- lapply(X, function(x) lapply(Y, function(y) subset(marks, name == x & subject == y)))
Объект L2
представляет собой список списков.
Вот вариант с циклами for:
df <- vector("list", length(X)*length(Y))
l <- 1
for (i in X) for (j in Y) {
df[[l]] <- subset(marks, name == i & subject == j)
l <- l+1
}
Для поднабора только для существующих уровней выможно просто использовать split()
L3 <- split(marks, list(marks$name, marks$subject))
Объект L3
- это список данных.