R 使用“聚集”堆栈列并引入新的因子类型

R 使用“聚集”堆栈列并引入新的因子类型,r,dplyr,tidyr,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.03

我有一个非常简单的
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)
)
我的第一次尝试是使用以下内容:

df2 <- df1 %>%
  gather(X1, X2, key = TypeX, value = Xs) %>%
  gather(Y1, Y2, key = TypeY, value = Ys)
df2%
聚集(X1,X2,key=TypeX,value=Xs)%>%
聚集(Y1,Y2,键=TypeY,值=Ys)
这接近我想要的,但实际上不是我真正想要的


我可以使用just gather实现此行为,还是需要其他功能

您的问题可以通过使用
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
N.B.我假设对于
G==3
from
X2
Y2
的结果对于
G==1&G==2
from
I==1:7


非常酷的解决方案。似乎有效,但与我的真实例子不同
G
是我的一个因素。任何想法,我怎么能解决它<无法修改代码>列G,因为它是一个分组变量由于此解决方案不需要分组,请在之前使用
ungroup()
(由于以前的转换,数据似乎仍然分组)。抱歉。我发现了我的错误。我只需要应用
ungroup()
behorefand。事实上,我的数据已经是不可编辑的了。我刚刚用
levels()
添加了一个额外的级别3,并将
mutate(BG=3)
更改为
mutate(BG=factor(3))
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