使用collect

时间:2018-01-25 07:40:36

标签: r dplyr tidyr

我有一个非常简单的df1,看起来像这样。

library(dplyr)
library(tidyr)

df1<-data.frame(
  G=c(1,1,1,1,1,1,1,2,2,2,2,2,2,2),
  I=c(1,2,3,4,5,6,7,1,2,3,4,5,6,7),
  X1=c( 0.043,  0.055,-0.060,  0.046,  0.140,  0.036,  0.045,  0.034,  0.032,  0.030,  0.029,  0.032,  0.032,  0.036),
  Y1=c(-0.422, -0.554,-0.426, -0.538, -0.446, -0.654, -0.437, -0.424, -0.416, -0.410, -0.411, -0.424, -0.397, -0.403),
  X2=c( 0.035 , 0.035, 0.023,  0.033,  0.040,  0.032,  0.036,  0.035,  0.035,  0.023,  0.033,  0.040,  0.032,  0.036),
  Y2=c(-0.420, -0.427,-0.409, -0.421, -0.422, -0.420, -0.402, -0.420, -0.427, -0.409, -0.421, -0.422, -0.420, -0.402)
)

我现在想使用聚集来转换这个元素,以便X2Y2堆叠在X1Y1之上,但BG=3 }。转换后,它应该有3 * 7行和4列名为G,I,X_a,Y_a。它应该如下所示(我只是用文本编辑器手动完成)。 (X2和Y2在因子BG之间不变)。

G I    X_a    Y_a
1 1  0.043 -0.422
1 2  0.055 -0.554
1 3 -0.060 -0.426
1 4  0.046 -0.538
1 5  0.140 -0.446
1 6  0.036 -0.654
1 7  0.045 -0.437
2 1  0.034 -0.424
2 2  0.032 -0.416
2 3  0.030 -0.410
2 4  0.029 -0.411
2 5  0.032 -0.424
2 6  0.032 -0.397
2 7  0.036 -0.403
3 1  0.035 -0.420
3 2  0.035 -0.427
3 3  0.023 -0.409
3 4  0.033 -0.421
3 5  0.040 -0.422
3 6  0.032 -0.420
3 7  0.036 -0.402

我的第一次尝试是使用以下内容:

df2 <- df1 %>%
  gather(X1, X2, key = TypeX, value = Xs) %>%
  gather(Y1, Y2, key = TypeY, value = Ys)

这接近我想要的,但实际上并不是我真正想要的东西。

我可以使用聚集来实现此行为,还是需要其他内容。

1 个答案:

答案 0 :(得分:2)

您的问题可以通过重命名bind_rows使用dplyr包来解决。

df %>%
  select(G, I, "X_a" = X1, "Y_a" = Y1) %>%
  bind_rows(
    df %>%
      filter(G == 1) %>%
      mutate(G = 3) %>%
      select(G, I, "X_a" = X2, "Y_a" = Y2)
  )

#    G I    X_a    Y_a
# 1  1 1  0.043 -0.422
# 2  1 2  0.055 -0.554
# 3  1 3 -0.060 -0.426
# 4  1 4  0.046 -0.538
# 5  1 5  0.140 -0.446
# 6  1 6  0.036 -0.654
# 7  1 7  0.045 -0.437
# 8  2 1  0.034 -0.424
# 9  2 2  0.032 -0.416
# 10 2 3  0.030 -0.410
# 11 2 4  0.029 -0.411
# 12 2 5  0.032 -0.424
# 13 2 6  0.032 -0.397
# 14 2 7  0.036 -0.403
# 15 3 1  0.035 -0.420
# 16 3 2  0.035 -0.427
# 17 3 3  0.023 -0.409
# 18 3 4  0.033 -0.421
# 19 3 5  0.040 -0.422
# 20 3 6  0.032 -0.420
# 21 3 7  0.036 -0.402
  

NB 我假设G == 3来自X2Y2的{​​{1}}和G == 1 & G == 2的结果与来自{I == 1:7的{​​{1}}重叠1}}