在R

时间:2019-11-11 01:40:44

标签: r dataframe

我正在进行联合分析,并试图创建一个选择任务数据框。到目前为止,我在联合包中使用caEncodedDesign()创建了正交数据框,现在尝试创建选择任务数据框。我正在努力寻找在design2数据框的每一行下添加两行的方法。 添加的第一行中的所有值应为原始值的+1,添加的第二行应为原始值的+2。什么是4,它必须变成1。

这是原始的设计2 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

我手工完成了第一行,我正在寻找可以应用于下面整行的R代码。

>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

2 个答案:

答案 0 :(得分:1)

我们可以逐行使用apply,对于行中的每个值,请使用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 
#.....

数据

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"))

答案 1 :(得分:1)

这是尝试,基于复制行,将0:2添加到每一列,然后通过减去>= 4来替换任何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
# ..