有没有一个R函数可以让我有条件地聚集



我有一个这样的数据帧(在变量IV1-IV5中,我存储了目标项目(F1、TI1、TI2、LI1、LI2(的问卷位置,这些项目依次包含评级(:

SUBJECT EXP IV1 IV2 IV3 IV4 IV5 F1 TI1 TI2 LI1 LI2
1       1   n TI2 LI1  F1 LI2 TI1 25  75  75  50  50
2       2   n LI1 TI2 LI2  F1 TI1 30  70  70  45  45
3       3   e TI1  F1 TI2 LI2 LI1 25  70  70  50  50

我想把它变成一个长的数据帧,像这样:

SUBJECT    EXP    TYPE    IV    Rating
1       1      n     F1      3        25
2       1      n     TI1     5        75
3       1      n     TI2     1        50
4       1      n     LI1     2        50
5       1      n     LI2     4        50
6       2      n     F1      4        30
7       2      n     TI1     5        70
8       2      n     TI2     2        70
9       2      n     LI1     1        45
10       2      n     LI2     3        45
11       3      e     F1      2        25
12       3      e     TI1     1        70
13       3      e     TI2     3        70
14       3      e     LI1     5        50
15       3      e     LI2     4        50

我知道gather((,但我不认为它自己能完成这个转换。还有什么比自己写一堆ifelse语句更快的吗?

我的一个想法是制作一个新的列,并有条件地对((两个单元格进行联合(对于每个TI列,将评级与具有匹配值的IV列名称联合(,然后在这些组合的列之间进行gather((,以便随后分离(。但这似乎很乏味,因为我确信,这一定是一个常见的问题。任何建议都会有所帮助——谢谢!

编辑:我的MWE并没有像它应该的那样代表我的问题。我更改了上面两个示例DF中的一些内容。

这就是我能够想到的。我更了解gather((,pivot_langer((不断抛出错误。

df1 <- df %>%
gather("TYPE", "RATING", -SUBJECT, -EXP, -IV1, -IV2, -IV3, -IV4, -IV5) %>%
gather("POS", "foobar", -SUBJECT, -EXP, -TYPE, -RATING) %>%
filter(TYPE == foobar) %>%
select(-foobar)

这是我可以接受的初步结果(并根据需要进行一些清理(:

SUBJECT EXP TYPE RATING POS
1   n  TI2     75 IV1
1   n  LI1     50 IV2
1   n   F1     25 IV3
1   n  LI2     50 IV4
1   n  TI1     75 IV5
2   n  LI1     45 IV1
2   n  TI2     70 IV2
2   n  LI2     45 IV3
2   n   F1     30 IV4
2   n  TI1     70 IV5
3   e  TI1     70 IV1
3   e   F1     25 IV2
3   e  TI2     70 IV3
3   e  LI2     50 IV4
3   e  LI1     50 IV5

我很乐意接受改进的建议。到目前为止,感谢Ronak Shah的指导。

最新更新