返回使用R中的2个因子的阶乘行组合的列表

时间:2018-01-07 22:35:15

标签: r loops combinations apply

我有一个包含两个识别因子的数据集,Day(A-D)和tTime(因子1-4),以及三个数字变量。我想返回一个列表,其中包含包含每个因子之一的每个行组合

实施例。列表中的条目1将是具有Day x tTime因子组合A-1,B-1,C-1,D-1的4行。第二项是A-2,B-1,C-1,D-1等4行,最终生成一个包含256个条目的列表(我认为...... 4 * 4 * 4 * 4?) 。

我已经对此进行过一段时间的工作/搜索,但我对编程和R非常陌生,所以不要尝试任何甚至接近发布的尝试。

示例数据集:

testData <- data.frame(Day = rep(c("A", "B", "C", "D"), 4),
                       tTime = factor(rep(1:4, rep(4,4))),
                       numDat1 = rnorm(16, mean = 3, sd = 5),
                       numDat2 = rnorm(16, mean = 1, sd = 10),
                       numDat3 = rnorm(16, mean = 10, sd = 3))

1 个答案:

答案 0 :(得分:1)

这非常直接。我确实想知道为什么你想要所有这些重复数据 - 这可能是一种更有效的方式去做你做的事情(可能会根据需要制作行索引列表并使用每个子集?)

如果您的实际数据要大得多,我建议您使用键控数据表切换到data.table - merge步骤 更快。

x = expand.grid(A=1:4, B = 1:4, C = 1:4, D = 1:4)

result = apply(x, 1, function(r) data.frame(Day = c("A", "B", "C", "D"), tTime = r))
result = lapply(result, merge, testData)
result
# [[1]]
#   Day tTime   numDat1     numDat2   numDat3
# 1   A     1 -8.939716 -20.4731248 12.617296
# 2   B     1  8.992376  -0.2803529  8.524298
# 3   C     1  7.920297   1.2573052  7.072502
# 4   D     1 10.577459  15.9311881 13.875922
# 
# [[2]]
#   Day tTime   numDat1    numDat2   numDat3
# 1   A     2  9.689634  2.5874269  7.624269
# 2   B     1  8.992376 -0.2803529  8.524298
# 3   C     1  7.920297  1.2573052  7.072502
# 4   D     1 10.577459 15.9311881 13.875922
# 
# [[3]]
#   Day tTime   numDat1     numDat2   numDat3
# 1   A     3  6.210782 -10.5826679  7.526498
# 2   B     1  8.992376  -0.2803529  8.524298
# 3   C     1  7.920297   1.2573052  7.072502
# 4   D     1 10.577459  15.9311881 13.875922
# 
# [[4]]
#   Day tTime   numDat1    numDat2   numDat3
# 1   A     4  7.552972 10.5035948  7.999910
# 2   B     1  8.992376 -0.2803529  8.524298
# 3   C     1  7.920297  1.2573052  7.072502
# 4   D     1 10.577459 15.9311881 13.875922
# 
# [[5]]
#   Day tTime   numDat1    numDat2   numDat3
# 1   A     1 -8.939716 -20.473125 12.617296
# 2   B     2 -4.883532   6.526018 11.959817
# 3   C     1  7.920297   1.257305  7.072502
# 4   D     1 10.577459  15.931188 13.875922
# 
# [[6]]
#   Day tTime   numDat1   numDat2   numDat3
# 1   A     2  9.689634  2.587427  7.624269
# 2   B     2 -4.883532  6.526018 11.959817
# 3   C     1  7.920297  1.257305  7.072502
# 4   D     1 10.577459 15.931188 13.875922