【问题标题】:Using spread with duplicate identifiers gives sparse matrix with NAs使用带有重复标识符的扩展会给出带有 NA 的稀疏矩阵
【发布时间】:2018-08-25 10:06:03
【问题描述】:

一位用户在 github 中提出了一个问题,https://github.com/tidyverse/tidyr/issues/41,我看到 Hadley 将此识别为一个错误。但是,没有给出解决方案。当我的数据框上有重复的标识符时,我仍然遇到这个问题

structure(list(key = c("a", "b", "c", "d", "c"), value = c(1, 
2, 3, 2, 4)), .Names = c("key", "value"), row.names = c(NA, -5L
), class = c("tbl_df", "tbl", "data.frame"))

现在,当我使用 dplyr 的展开时,我仍然有一个带有 NA 的稀疏矩阵,因为我碰巧有重复的标识符`在此处输入代码

dftest %>% spread(key,value)
Error: Duplicate identifiers for rows (3, 5)

所以我添加了一个 ID 行

> dftest$id<-seq(1,5)
> dftest %>% spread(key,value)
# A tibble: 5 x 5
     id     a     b     c     d
  <int> <dbl> <dbl> <dbl> <dbl>
1     1    1.   NA    NA    NA 
2     2   NA     2.   NA    NA 
3     3   NA    NA     3.   NA 
4     4   NA    NA    NA     2.
5     5   NA    NA     4.   NA 

但是对角线数据框不是我想要的。我想要一个spread输出的第一行在第1行读取1,2,3,2。然后列c中的值将落在第2行的正下方。也就是说,我没有用具有 NA 的对角矩阵。我错过了什么吗?我谦虚地问。

【问题讨论】:

  • 你需要创建一个序列列然后spread

标签: r dplyr tidyverse spread


【解决方案1】:

你离得到正确的输出太近了。

使用原始输入中的dftest

方法:

dftest %>% group_by(key) %>% mutate(id = 1:length(key)) %>% spread(key, value)

输出:

# A tibble: 2 x 5
     id     a     b     c     d
  <int> <dbl> <dbl> <dbl> <dbl>
1     1    1.    2.    3.    2.
2     2   NA    NA     4.   NA

【讨论】:

  • @PanchoMulongeni 很高兴为您提供帮助。如果可行,请接受我的回答。