Я пытаюсь (эффективно) переставить dataframe в R.Перегруппировка dataframes в R
Мои данные экспериментальные данные, собранные в течение четырех различных экспериментов из двух популяций участников (1 или 0, то есть заболевания и контрольной группы) ,
Пример dataframe:
Subject type Experiment 1 Experiment 2 Experiment 3 Experiment 4
0 4.6 2.5 1.4 5.3
0 4.7 2.4 1.8 5.1
1 3.5 1.2 5.6 7.5
1 3.8 1.7 6.2 8.1
Я хотел бы изменить свою dataframe так, что она структурирована следующим образом (по причине того, что делает его легче для меня, чтобы запускать функции на данных, когда они структурированы как это в R):
Subject type Experiment Measure
0 1 4.6
0 2 2.5
0 3 1.4
0 4 5.3
0 1 4.7
0 2 2.4
0 3 1.8
0 4 5.1
1 1 3.5
1 2 1.2
1 3 5.6
1 4 7.5
1 1 3.8
1 2 1.7
1 3 6.2
1 4 8.1
Как вы можете видеть, произошло то, что каждый предмет теперь занимает четыре ряда; каждая строка теперь относится к одному измерению, а не к одному предмету. Это (по крайней мере на данный момент) более удобно для подключения к R-функциям. Возможно, со временем я придумаю способ пропустить этот шаг в целом, но я новичок в R, и это кажется лучшим способом сделать что-то.
В любом случае - вопрос в том, что является наиболее эффективным способом преобразования данных в виде данных? В настоящее время я делаю это так:
# Input dframe1
dframe1 <- structure(list(subject_type = c(0L, 0L, 1L, 1L), experiment_1 = c(4.6,
4.7, 3.5, 3.8), experiment_2 = c(2.5, 2.4, 1.2, 1.7), experiment_3 = c(1.4,
1.8, 5.6, 6.2), experiment_4 = c(5.3, 5.1, 7.5, 8.1)), .Names = c("subject_type",
"experiment_1", "experiment_2", "experiment_3", "experiment_4"
), class = "data.frame", row.names = c(NA, -4L))
# Create a matrix
temporary_matrix <- matrix(ncol=3, nrow=nrow(dframe1) * 4)
colnames(temporary_matrix) <- c("subject_type","experiment","measure")
# Rearrange dframe1 so that a different measure is in each column
for(i in 1:nrow(dframe1)) {
temporary_matrix[i*4-3,"subject_type"] <- dframe1$subject_type[i]
temporary_matrix[i*4-3,"experiment"] <- 1
temporary_matrix[i*4-3,"measure"] <- dframe1$experiment_1[i]
temporary_matrix[i*4-2,"subject_type"] <- dframe1$subject_type[i]
temporary_matrix[i*4-2,"experiment"] <- 2
temporary_matrix[i*4-2,"measure"] <- dframe1$experiment_2[i]
temporary_matrix[i*4-1,"subject_type"] <- dframe1$subject_type[i]
temporary_matrix[i*4-1,"experiment"] <- 3
temporary_matrix[i*4-1,"measure"] <- dframe1$experiment_3[i]
temporary_matrix[i*4-0,"subject_type"] <- dframe1$subject_type[i]
temporary_matrix[i*4-0,"experiment"] <- 4
temporary_matrix[i*4-0,"measure"] <- dframe1$experiment_4[i]
}
# Convert matrix to a data frame
dframe2 <- data.frame(temporary_matrix)
# NOTE: For some reason, this has to be converted back into a double (at some point above it becomes a factor)
dframe2$measure <- as.double(as.character(dframe2$measure))
Конечно есть лучший способ сделать это ?!
Посмотрите на упаковке reshape2 или изменить форму в базе R. –
+1! спасибо за этот полный вопрос, он содержит: 1-Что вы хотите сделать? Что вы пробовали 3 воспроизводимый пример. – agstudy