Как создать несколько фреймов данных, используя вложенные циклы for - PullRequest
0 голосов
/ 23 мая 2018

набор данных помечает

X <- c("vijay","raj","joy")

Y <- c("maths","eng","science","social","hindi","physical","sanskrit")    

df <- list()

for (i in X){
  for (j in Y)
  {

    df <- data.frame(subset(marks, name == i & subject == j))
  }
}

здесь я хочу создать подмножества, имеющие отметки по всем предметам против каждого студента.Таким образом, мы хотим иметь 3 X 7 подмножеств.Но код, который я написал, дает мне единственное подмножество.Как можно решить проблему?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы можете использовать 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 - это список данных.

0 голосов
/ 23 мая 2018

Мы могли бы сделать это с помощью expand.grid, чтобы создать все комбинации, а затем перебрать строки набора данных и subset «отметки», чтобы получить list из data.frame s

dat <- expand.grid(X, Y, stringsAsFactors = FALSE)
lst <- apply(dat, 1, function(x) subset(marks, name == x[1] & subject == x[2]))

Или с использованием tidyverse

library(tidyverse)
crossing(X, Y) %>%
   pmap(~ marks %>%
             filter(name == ..1, subject == ..2))

data

set.seed(24)
marks <- data.frame(name = sample(X, 100, replace = TRUE), 
  subject = sample(Y, 100, replace = TRUE), stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...