我有一个非常简单的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)
)
我现在想使用聚集来转换这个元素,以便X2
和Y2
堆叠在X1
和Y1
之上,但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)
这接近我想要的,但实际上并不是我真正想要的东西。
我可以使用聚集来实现此行为,还是需要其他内容。
答案 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
来自X2
和Y2
的{{1}}和G == 1 & G == 2
的结果与来自{I == 1:7
的{{1}}重叠1}}