0

真的很抱歉再次问这个问题,因为关于这个问题已经有很多了。但是,没有一个解决方案适用于我的问题。

我的数据如下所示:

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()),我不会将两个评估者放在一个列中,而是将一行中的每个评估者都放在另一个评估者的评级中。

我觉得我尝试了所有我能找到的东西,并且非常感谢一些帮助!非常感谢您!

4

1 回答 1

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

尽管我几乎从不建议在 and 函数上使用该reshape函数gatherspread但以下是使用 base R 的方法:

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))
于 2018-07-05T13:05:57.687 回答