传播重复的标识符

时间:2018-07-05 13:03:51

标签: r tidyr spread

非常抱歉再次提出这个问题,因为对此已经有很多问题。但是,没有一种解决方案可以解决我的问题。

我的数据如下:

id scale rater rating  
1   A      1      5
1   B      1      7
1   A      2      3
1   B      2      6
2   A      1      4
2   B      1      3
2   A      2      2
2   B      2      1

我要spread(rater, rating)

最后它应该看起来像这样:

id scale   1      2  
1   A      5      3
1   B      7      6
2   A      4      2
2   B      3      1

问题显然是第一个数据集中的行没有唯一标识符。查看类似问题的答案,似乎没有一种解决方案适合我。我不能只删除重复的行,而在使用行号或分组的标识符group_by(id) %>% mutate (grouped_id = row_number())时,我不会将两个评估者放在一列中,而是将每个评估者的行都用NA表示另一评估者的等级。

我觉得我已经尽了一切努力,并且会非常感谢您的帮助!提前非常感谢您!

1 个答案:

答案 0 :(得分:1)

我们可以使用spread函数,而无需group_by进行任何操作(感谢@Jaap):

library(tidyr)

dat %>%
    spread(rater, rating)

# A tibble: 4 x 4
     id scale   `1`   `2`
  <int> <chr> <int> <int>
1     1 A         5     3
2     1 B         7     6
3     2 A         4     2
4     2 B         3     1

使用reshape

进行编辑

尽管我几乎不建议使用reshapegather函数中的spread函数,但是这是使用基数R的方法: / p>

reshape(dat, direction = 'wide',
        idvar = c('id','scale'),
        v.names = 'rating',
        timevar = 'rater')

  id scale rating.1 rating.2
1  1     A        5        3
2  1     B        7        6
5  2     A        4        2
6  2     B        3        1

数据

dat <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), 
               scale = c("A", "B", "A", "B", "A", "B", "A", "B"), 
               rater = c(1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L), 
               rating = c(5L, 7L, 3L, 6L, 4L, 3L, 2L, 1L)),
          class = "data.frame", row.names = c(NA, -8L))