我正在使用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()
命令时删除重复项权重最小的记录吗?
答案 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
要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