如何根据具有特定顺序的向量对具有多列和多行的数据框进行重新排序?

How can i reorder data frame with many columns and rows according to vector with specific order?

在 R 中,我有两个数据框,我需要根据第二个 df 的顺序重塑第一个。

使用实际数据

Sheet '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软件进行实验分析。最大的区别是 em 'df' 我对这个实验有三个反应,而且组织的行也有差异。

我需要重塑数据框 'df' 以使其等于数据框 'plan.person',但是我需要三帧数据 'plan.person' (plan.person1, plan.person2, plan.person3),数据框 'df'.[=15= 中分析的每个响应(去除 SMO 的百分比、去除 CO 的百分比、去除 Bright-Edge 80 的百分比)一个]

请问,我该怎么做?

** 我用一个更小的例子展示了一个使用玩具数据的更一般的例子。

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)

在这个较小的示例中,我需要根据 Temperatura (= Temp)、Concentracao (= Conc) 和 Velocidade (= Speed) 信息,以组织实验响应,以便您可以继续使用 FrF2 包。

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

因为顺序很重要,而且你有重复的组合,我认为订购两个数据框,绑定它们,然后 return 到原始顺序更容易:

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.personFrF2 添加了很多额外内容, 和其他功能可能取决于它们。