Сделать фрейм данных одним списком в R - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть фрейм данных из 228 строк и 228 столбцов.Я хочу установить этот кадр данных без применения каких-либо условий.вместо этого подмножество будет основано на выбранных строках и столбцах.и каждое подмножество будет элементом моего списка.например, df - это фрейм данных, я хочу, чтобы первый элемент моего списка был df [1: 6,1: 6], а второй элемент - df [1: 6,7: 12] и так далее до двух последних элементов.которые представляют собой df [223: 228, 217: 222] и df [223: 228, 223: 228].длина моего списка должна быть 1444. Я пробовал цикл, но это не так.мой код:

df<- data.frame(replicate(228,sample(0:234,228,rep=TRUE)))
f<- seq(1,nrow(df),6)
mylist<- list()
for(i in f){for( j in f){
  a<- (df[i:i+5,j:j+5])
}
  mylist[[i]]<- a
}

my data frame is

Ожидаемые результаты:

enter image description here

1 Ответ

1 голос
/ 29 сентября 2019

Следующие две функции выполняют то, о чем спрашивают вопрос и последующее действие комментарий .Функции имеют аргумент, позволяющий передавать размеры результирующего информационного кадра в splitList, по умолчанию n = 6.

splitList <- function(DF, n = 6){
  f <- seq(1, nrow(DF), n)
  result_list <- lapply(f, function(j) lapply(f, function(i) DF[i:(i + n - 1), j:(j + n - 1)]))
  unlist(result_list, recursive = FALSE)
}

combineList <- function(X, n = 6){
  L <- length(X)
  M <- sqrt(L)
  f <- seq(1, L, M)
  tmp <- lapply(f, function(i){
    inx <- i:(i + M - 1)
    do.call(rbind, X[inx])
  })
  do.call(cbind, tmp)
}

mylist <- splitList(df)
d2 <- combineList(mylist)
identical(df, d2)
#[1] TRUE

Окончательная очистка.

rm(d2)
...