将复杂的组合列表转换为数据框

问题描述 投票:0回答:1

我创建了以下代码,生成组合列表


library(conjoint)

data(ice)
experiment<-expand.grid(
  flavor=c("chocolate","vanilla","strawberry"),
  price=c("$1.50","$2.00","$2.50"),
  container=c("cone","cup"),
  topping=c("yes","no"))

# Dividir el conjunto de datos en grupos de 3 filas
grupos <- split(experiment, rep(1:ceiling(nrow(experiment)/3), each=3, length.out=nrow(experiment)))

# Crear escenarios para cada grupo
escenarios <- lapply(grupos, function(grupo) {
  # Mostrar los objetos de cada grupo
  for (i in 1:nrow(grupo)) {
    cat("Objeto", i, ":\n")
    print(grupo[i, ])
    cat("\n")
  }
})

获取以下对象列表

Objeto 1 :
     flavor price container topping
1 chocolate $1.50      cone     yes

Objeto 2 :
   flavor price container topping
2 vanilla $1.50      cone     yes

Objeto 3 :
      flavor price container topping
3 strawberry $1.50      cone     yes

Objeto 1 :
     flavor price container topping
4 chocolate $2.00      cone     yes

Objeto 2 :
   flavor price container topping
5 vanilla $2.00      cone     yes

Objeto 3 :
      flavor price container topping
6 strawberry $2.00      cone     yes

Objeto 1 :
     flavor price container topping
7 chocolate $2.50      cone     yes

Objeto 2 :
   flavor price container topping
8 vanilla $2.50      cone     yes

Objeto 3 :
      flavor price container topping
9 strawberry $2.50      cone     yes

Objeto 1 :
      flavor price container topping
10 chocolate $1.50       cup     yes

Objeto 2 :
    flavor price container topping
11 vanilla $1.50       cup     yes

Objeto 3 :
       flavor price container topping
12 strawberry $1.50       cup     yes

Objeto 1 :
      flavor price container topping
13 chocolate $2.00       cup     yes

Objeto 2 :
    flavor price container topping
14 vanilla $2.00       cup     yes

Objeto 3 :
       flavor price container topping
15 strawberry $2.00       cup     yes

Objeto 1 :
      flavor price container topping
16 chocolate $2.50       cup     yes

Objeto 2 :
    flavor price container topping
17 vanilla $2.50       cup     yes

Objeto 3 :
       flavor price container topping
18 strawberry $2.50       cup     yes

Objeto 1 :
      flavor price container topping
19 chocolate $1.50      cone      no

Objeto 2 :
    flavor price container topping
20 vanilla $1.50      cone      no

Objeto 3 :
       flavor price container topping
21 strawberry $1.50      cone      no

Objeto 1 :
      flavor price container topping
22 chocolate $2.00      cone      no

Objeto 2 :
    flavor price container topping
23 vanilla $2.00      cone      no

Objeto 3 :
       flavor price container topping
24 strawberry $2.00      cone      no

Objeto 1 :
      flavor price container topping
25 chocolate $2.50      cone      no

Objeto 2 :
    flavor price container topping
26 vanilla $2.50      cone      no

Objeto 3 :
       flavor price container topping
27 strawberry $2.50      cone      no

Objeto 1 :
      flavor price container topping
28 chocolate $1.50       cup      no

Objeto 2 :
    flavor price container topping
29 vanilla $1.50       cup      no

Objeto 3 :
       flavor price container topping
30 strawberry $1.50       cup      no

Objeto 1 :
      flavor price container topping
31 chocolate $2.00       cup      no

Objeto 2 :
    flavor price container topping
32 vanilla $2.00       cup      no

Objeto 3 :
       flavor price container topping
33 strawberry $2.00       cup      no

Objeto 1 :
      flavor price container topping
34 chocolate $2.50       cup      no

Objeto 2 :
    flavor price container topping
35 vanilla $2.50       cup      no

Objeto 3 :
       flavor price container topping
36 strawberry $2.50       cup      no

我想将其转换为数据框。我尝试过以下代码:

f <-  as.data.frame(do.call(cbind, grupos))

得到了不想要的结果

我希望将其放入数据框中的方式是

对象1 对象2 对象3
巧克力 1.50 美元
甜筒
是的
香草 1.50 美元
甜筒
是的
草莓 1.50 美元
甜筒
是的
第二个

我尝试了如下所示的代码

# Crear un dataframe para almacenar los escenarios reconfigurados
df_escenarios <- data.frame(matrix(ncol = 3, nrow = length(escenarios)))
colnames(df_escenarios) <- c("Object 1", "Object 2", "Object 3")

# Llenar el dataframe con los escenarios
for (i in 1:length(escenarios)) {
    if (length(escenarios[[i]]) > 0) {  # Verificar que haya escenarios en el grupo
        df_escenarios[i, ] <- unlist(escenarios[[i]])
    } else {
        df_escenarios[i, ] <- NA  # Si no hay escenarios, llenar con NA
    }
}
# Imprimir el dataframe
print(df_escenarios)

但尝试是空的

     Object 1 Object 2 Object 3
1        NA       NA       NA
2        NA       NA       NA
3        NA       NA       NA
4        NA       NA       NA
5        NA       NA       NA
6        NA       NA       NA
7        NA       NA       NA
8        NA       NA       NA
9        NA       NA       NA
10       NA       NA       NA
11       NA       NA       NA
12       NA       NA       NA 

提前感谢您的帮助

r dataframe dplyr
1个回答
0
投票

使用 dplyr::mutate: 的一种解决方案

mutate(experiment, 
       row=rep(1:12, each=3),
       group=rep(1:3, 12),
       Object=paste(flavor, price, container, topping), .keep="none") %>%
  group_by(group) %>%
  pivot_wider(names_from="group",
              values_from="Object",
              names_prefix="Object")
___
# A tibble: 12 × 4
     row Object1                  Object2                Object3                  
   <int> <chr>                    <chr>                  <chr>                    
 1     1 chocolate $1.50 cone yes vanilla $1.50 cone yes strawberry $1.50 cone yes
 2     2 chocolate $2.00 cone yes vanilla $2.00 cone yes strawberry $2.00 cone yes
 3     3 chocolate $2.50 cone yes vanilla $2.50 cone yes strawberry $2.50 cone yes
 4     4 chocolate $1.50 cup yes  vanilla $1.50 cup yes  strawberry $1.50 cup yes 
 5     5 chocolate $2.00 cup yes  vanilla $2.00 cup yes  strawberry $2.00 cup yes 
 6     6 chocolate $2.50 cup yes  vanilla $2.50 cup yes  strawberry $2.50 cup yes 
 7     7 chocolate $1.50 cone no  vanilla $1.50 cone no  strawberry $1.50 cone no 
 8     8 chocolate $2.00 cone no  vanilla $2.00 cone no  strawberry $2.00 cone no 
 9     9 chocolate $2.50 cone no  vanilla $2.50 cone no  strawberry $2.50 cone no 
10    10 chocolate $1.50 cup no   vanilla $1.50 cup no   strawberry $1.50 cup no  
11    11 chocolate $2.00 cup no   vanilla $2.00 cup no   strawberry $2.00 cup no  
12    12 chocolate $2.50 cup no   vanilla $2.50 cup no   strawberry $2.50 cup no 
© www.soinside.com 2019 - 2024. All rights reserved.