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
我正在使用 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