Преобразование данных наблюдений, хранящихся в 2D-фрейме данных, в 3D-массив в R - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь создать трехмерный массив из 2D-фрейма данных в R и действительно могу использовать некоторую помощь.До сих пор я не нашел решения этой проблемы из аналогичных вопросов, которые были опубликованы ранее.

Мои входные данные доступны здесь: https://www.dropbox.com/s/7f8td34mpzgpvgh/example_data.csv?dl=0,, и они напоминают следующую базовую структуру: Iиметь 14 сайтов (т. е. Field) с 6 повторностями в каждом (т. е. Replicate), в которых подмножество из 32 предметов (т. е. столбцы кодов видов: AMGO, BASW и т. д.) были подсчитаны при наличии вsurvey.

Подмножество входных данных выглядит следующим образом:

example_data[1:5, 1:5]

       Field Replicate AMGO BASW BHCO
1   Brinkman         1    2    0    0
72  Brinkman         2   10    0    0
190 Brinkman         3    6    0    0
283 Brinkman         4    0    0    0
342 Brinkman         5    2    1    0

Я хотел бы переформатировать эти входные данные, чтобы они напоминали трехмерный массив (т.е. 14 сайтов x 6 копий x 32субъекты), как показано ниже для вида AMGO:

, ,  = AMGO

            1 2 3 4 5 6
Brinkman    0 0 0 0 0 0
Clara       0 0 0 0 0 0
Esckelson   0 0 0 0 0 0
GarnerEast  0 0 0 0 0 0
GarnerWest  0 0 0 0 0 0
KHess       0 0 0 0 0 0
Lounsbury   0 0 0 0 0 0
McCallum    0 0 0 0 0 0
Pomeroy     0 0 0 0 0 0
Sattelberg  0 0 0 0 0 0
THess       0 0 0 0 0 0
Turner      0 0 0 0 0 0
VollmarEast 0 0 0 0 0 0
VollmarWest 0 0 0 0 0 0

...

Обратите внимание, что в решении многие из нулей, приведенных выше, вероятно, будут заменены ненулевыми счетами, когда AMGO (и другиевиды) встречались (были) на самом деле во время обследования.

Пожалуйста, дайте мне знать, если мне нужно что-то уточнить, и спасибо заранее!

1 Ответ

0 голосов
/ 16 сентября 2018

Вот решение с использованием функции reshape() из базы R. Я применяю функцию к каждому из столбцов темы и создаю список измененных фреймов данных.

df <- read.csv("C:\\Users\\Shrivatav\\Downloads\\example_data.csv", encoding = "UTF-8")

# Extract subject columns 
list.of.cols <- colnames(df)[3:34]

# Function for reshaping
func.for.reshaping <- function(column){

  # Subset the data, keep only Field, replicate and the column input in the 
  # function
  to.keep <- c("Field", "Replicate", column)
  subset.df <- df[to.keep]
  # reshape from long to wide
  reshaped.df <- reshape(subset.df, idvar = "Field", timevar = "Replicate", direction = "wide")
  return(reshaped.df)
}

# Apply the function over all subject columns, reulting
# in a list of dataframes
list.of.reshaped.dfs <- lapply(list.of.cols, func.for.reshaping)

# Name the list for easy access
names(list.of.reshaped.dfs) <- list.of.cols

Вы можете получить доступ к элементамсписка вроде: list.of.reshaped.dfs$AMGO и пр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...