tidyr

时间:2017-11-07 23:09:32

标签: r tidyr

我正在使用tidyr中的R,并且在使用带有重复标识符的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的重量被记录两次。这实际上不是一个错误,因为鲍勃确实记录了他的体重两次。我希望能够做的就是运行命令并让它给我回复以下内容:

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

传播的不是我应该使用的命令来完成这个吗?如果没有一个简单的解决方案,有一种简单的方法可以在运行spread()命令时删除重复项权重最小的记录吗?

1 个答案:

答案 0 :(得分:2)

在创建唯一标识符后,可以通过在表示每个组中的索引的新变量来完成,您可以使用fill填充第二个“Bob”行,其中“height”和“级”。

您可以通过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

filtername / 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