tidyr 中的重复标识符错误

Duplicate identifier error in tidyr

我正在使用 R 中的 tidyr,并且 运行 在使用带有重复标识符的 spread() 命令时遇到了问题。

这是一个模拟示例来说明问题:

X = data.frame(name=c("Eric","Bob","Mark","Bob","Bob","Mark","Eric","Bob","Mark"),
               metric=c("height","height","height","weight","weight","weight","grade","grade","grade"),
               values=c(6,5,4,120,118,180,"A","B","C"),
               stringsAsFactors=FALSE)

tidyr::spread(X,metric,values)

所以当我 运行 这个命令时,我得到以下错误:

Error: Duplicate identifiers for rows (4, 5)

这就是错误的原因,因为 Bob 的体重被记录了两次。这实际上不是一个错误,因为 Bob 确实记录了两次他的体重。我希望能够做的是拥有 运行 命令并让它返回以下内容:

name height weight grade
Eric     6     NA     A
Bob      5    120     B
Bob      5    118     B
Mark     4    180     C

spread 不是我应该用来完成此操作的命令吗?如果没有简单的解决方案,是否有一种简单的方法可以在 运行 执行 spread() 命令时删除具有最低权重的重复记录?

创建唯一标识符后,可以通过创建一个代表每个组内索引的新变量来完成,您可以使用 fill 为第二个 "Bob" 行填充一个重复值 "height" 和 "grade".

您可以通过select删除末尾的索引变量。

library(dplyr)
library(tidyr)

X %>%
     group_by(name, metric) %>%
     mutate(row = row_number() ) %>%
     spread(metric, values) %>%
     fill(grade, height) %>%
     select(-row)

# A tibble: 4 x 4
# Groups:   name [3]
   name grade height weight
  <chr> <chr>  <chr>  <chr>
1   Bob     B      5    120
2   Bob     B      5    118
3  Eric     A      6   <NA>
4  Mark     C      4    180

filter到每个name/metric组的最大值:

X %>%
     group_by(name, metric) %>%
     filter(values == max(values)) %>%
     spread(metric, values)

# A tibble: 3 x 4
# Groups:   name [3]
   name grade height weight
* <chr> <chr>  <chr>  <chr>
1   Bob     B      5    120
2  Eric     A      6   <NA>
3  Mark     C      4    180