Как я могу переупорядочить фрейм данных с большим количеством столбцов и строк в соответствии с вектором в определенном порядке? - PullRequest
0 голосов
/ 21 мая 2018

В R, у меня есть два фрейма данных, и мне нужно изменить форму первого в соответствии с порядком второго df.

Используя фактические данные

Лист 'Plan2'

https://docs.google.com/spreadsheets/d/1jkxik-QWz0kQYskQQXgaP0TXT7TsBLjp5RHSqtEw0pU/edit?usp=sharing

if(!require("FrF2")) install.packages("FrF2") ; library(FrF2)

df <- EXPERIMENTO_SALA <- read_excel("mypath/EXPERIMENTO SALA.xlsx", 
                           col_types = c("numeric", "numeric", "numeric", 
                                         "numeric", "numeric", "numeric", 
                                         "numeric", "numeric", "numeric"))


view(df)
print.data.frame(df)

Другой кадр данных:

plan.person = FrF2(nfactors = 5,
               resolution = 5,
               replications = 2,
               randomize = FALSE,
               factor.names = list(
                 pH = c(3, 9),
                 Temp = c(5, 30),
                 Dose = c(0.05, 0.5),
                 Conc = c(50, 350),
                 Speed = c(100, 200)
               ))

view(plan.person)

Обратите внимание, что кадры данных похожи.Это потому, что я копирую учебу для практики программного обеспечения R для анализа эксперимента.Большая разница в том, что у меня 'df' есть три ответа для этого эксперимента, и есть также разница в организованных строках.

Мне нужно изменить форму фрейма данных 'df', чтобы он был равен даннымфрейм 'plan.person', однако мне нужно три фрейма данных 'plan.person' (plan.person1, plan.person2, plan.person3), по одному на каждый анализируемый ответ (% удаления SMO,% удаления CO% удаления Bright-Edge 80), которые находятся во фрейме данных 'df'.

Пожалуйста, как мне это сделать?

** Я представляю более общий пример с использованием игрушечных данных.используя меньший пример.

if(!require("FrF2")) install.packages("FrF2") ; library(FrF2)
if(!require("truncnorm")) install.packages("truncnorm") ; library(truncnorm)

plan.person = FrF2(nfactors = 3,
               resolution = 3,
               replications = 2,
               randomize = FALSE,
               factor.names = list(
                 Temp = c(5, 30),
                 Conc = c(50, 350),
                 Speed = c(100, 200)
               ))

Temperatura <- c(5, 5, 30, 30, 5, 5, 30, 30)
Concentracao <- c(350, 50, 350, 50, 350, 50, 350, 50)
Velocidade <- c(100, 200, 200, 100, 100, 200, 200, 100)

remov_SMO <- rtruncnorm(n=8, a=0, mean=61.16, sd=31.32)
remov_CO <- rtruncnorm(n=8, a=0, mean=79, sd=24.17)
remov_BE <- rtruncnorm(n=8, a=0, mean=71.43, sd=29.61)


df <- data.frame(Temperatura, Concentracao, Velocidade, remov_SMO,
            remov_CO, remov_BE)


view(df)
view(plan.person)

В этом меньшем примере мне нужно отсортировать строку фрейма данных 'df' так же, как фрейм данных 'plan.person' согласно Temperatura (= Temp), Concentracao (= Conc) и Velocidade (= Speed) для организации ответов эксперимента, чтобы вы могли продолжать использовать пакет FrF2.

https://i.imgur.com/DQBHQNi.png

1 Ответ

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

Поскольку порядок важен, и у вас есть дублирующиеся комбинации, я думаю, что проще упорядочить оба фрейма данных, связать их и затем вернуться к исходному порядку:

df <- data.frame(Temperatura,
                 Concentracao,
                 Velocidade,
                 remov_SMO, remov_CO, remov_BE)


reorder_ids <- do.call(order, as.list(plan.person))
plan_ordered <- plan.person[reorder_ids,]
df_ordered <- df[do.call(order, as.list(df[, 1:3])),]

new_plan <- data.frame(plan_ordered, df_ordered[, -(1:3)])
new_plan <- new_plan[reorder_ids,] # restore original order
attributes(new_plan) <- attributes(plan.person)

Я думаю new_plan должен иметь то, что вы хотите, но вам, возможно, придется настроить имена столбцов.

РЕДАКТИРОВАТЬ: Я был бы особенно осторожен с выходными атрибутами, мне кажется, что plan.person имеет довольно много дополнений, добавленных FrF2, и другие функции могут зависеть от них.

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