将数据传输到更高维度

时间:2019-08-07 20:21:51

标签: r dataframe

我需要将数据移至更高维度。我需要从x到exp(x ^ 2)的每一列转换,对于cl1和col 2列的每对x1和x2,我都需要一个新列,其值为exp(e ^ {-2xy})。这是一个小例子:(我的数据集中有更多列)

     col1.    col2.    col3. 
       2      3        4    

放出

     col1.    col2.    col3.      col(1,2)  col(2,3)  col(1,3)
    exp(4)    exp(9)   exp(16)    exp(-12).  exp(-24)  exp(-16)

1 个答案:

答案 0 :(得分:1)

为使事情有趣,我将连续增加您的数据,以免马虎:-)

您的行排在第一位,然后进行验证。

dat <- data.frame(col1=2:3, col2=3:4, col3=4:5)

由于您的验证未进行实际计算,因此我将在初次运行时忽略exp()

第一个问题是直截了当的:

lapply(dat, function(a) (a^2))
# $col1
# [1] 4 9
# $col2
# [1]  9 16
# $col3
# [1] 16 25

第二个需要更多的工作,但不多:

combinations <- combn(3, 2)
combnames <- apply(combinations, 2, paste, collapse = "_")
setNames(data.frame(apply(combinations, 2, function(i) -2 * dat[,i[1]] * dat[,i[2]])),
         combnames)
#   1_2 1_3 2_3
# 1 -12 -16 -24
# 2 -24 -30 -40

从这里开始,只是cbind在一起。我现在包括了exp(),但是使用exp(e^...)似乎是一个错字,因此我也只能推断出exp()用于第二批。

cbind(
  lapply(dat, function(a) exp(a^2)),
  setNames(data.frame(apply(combinations, 2, function(i) exp(-2 * dat[,i[1]] * dat[,i[2]]))),
           combnames)
)
#         col1        col2        col3          1_2          1_3          2_3
# 1   54.59815    8103.084     8886111 6.144212e-06 1.125352e-07 3.775135e-11
# 2 8103.08393 8886110.521 72004899337 3.775135e-11 9.357623e-14 4.248354e-18