user12353034
user12353034

Reputation:

creating additional rows in R

I am working on conjoint analysis and trying to create a choice-task dataframe. So far, I created orthogonal dataframe using caEncodedDesign() in conjoint package and now trying to create a choice-task dataframe. I am struggling to find ways to add two additional rows under each row of design2 dataframe. All the values in the first added row should be +1 of the original value and the second added row is +2 of the original values. what the value is 4, it has to become 1.

This is the orginal design2 d.f

> design2
    price color privacy battery stars
17      2     3       2       1     1
21      3     1       3       1     1
34      1     3       1       2     1
60      3     2       1       3     1
64      1     1       2       3     1
82      1     1       1       1     2
131     2     2       3       2     2
153     3     3       2       3     2
171     3     3       1       1     3
175     1     2       2       1     3
201     3     1       2       2     3
218     2     1       1       3     3
241     1     3       3       3     3

I did the first row by hand, and I am looking for R code that could apply to the whole rows below.

>design2
    price color privacy battery stars
17      2     3       2       1     1
        3     1       3       2     2
        1     2       1       3     3
21      3     1       3       1     1
34      1     3       1       2     1
60      3     2       1       3     1
64      1     1       2       3     1
82      1     1       1       1     2
131     2     2       3       2     2
153     3     3       2       3     2
171     3     3       1       1     3
175     1     2       2       1     3
201     3     1       2       2     3
218     2     1       1       3     3
241     1     3       3       3     3

Upvotes: 0

Views: 68

Answers (2)

thelatemail
thelatemail

Reputation: 93813

Here's an attempt, based on duplicating rows, adding 0:2 to each column, and then replacing anything >= 4 by subtracting 3

design2 <- design2[rep(seq_len(nrow(design2)), each=3),]
design2 <- design2 + 0:2
sel <- design2 >= 4
design2[sel] <- (design2 - 3)[sel]

design2
#      price color privacy battery stars
#17        2     3       2       1     1
#17.1      3     1       3       2     2
#17.2      1     2       1       3     3
#21        3     1       3       1     1
#21.1      1     2       1       2     2
#21.2      2     3       2       3     3
#34        1     3       1       2     1
#34.1      2     1       2       3     2
#34.2      3     2       3       1     3
# ..

Upvotes: 1

Ronak Shah
Ronak Shah

Reputation: 388862

We can use apply row-wise and for every value in the row include the missing values using setdiff

out_df <- do.call(rbind, apply(design2, 1, function(x) 
              data.frame(sapply(x, function(y) c(y, setdiff(1:3, y))))))
rownames(out_df) <- NULL

out_df

#   price color privacy battery stars
#1      2     3       2       1     1
#2      1     1       1       2     2
#3      3     2       3       3     3
#4      3     1       3       1     1
#5      1     2       1       2     2
#6      2     3       2       3     3
#7      1     3       1       2     1
#8      2     1       2       1     2
#9      3     2       3       3     3 
#.....

data

design2 <- structure(list(price = c(2L, 3L, 1L, 3L, 1L, 1L, 2L, 3L, 3L, 
1L, 3L, 2L, 1L), color = c(3L, 1L, 3L, 2L, 1L, 1L, 2L, 3L, 3L, 
2L, 1L, 1L, 3L), privacy = c(2L, 3L, 1L, 1L, 2L, 1L, 3L, 2L, 
1L, 2L, 2L, 1L, 3L), battery = c(1L, 1L, 2L, 3L, 3L, 1L, 2L, 
3L, 1L, 1L, 2L, 3L, 3L), stars = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L)), class = "data.frame", row.names = c("17", 
"21", "34", "60", "64", "82", "131", "153", "171", "175", "201", "218", "241"))

Upvotes: 1

Related Questions