多个

时间:2018-05-08 16:51:25

标签: r

我有一个如下所示的数据集。

df = data.frame(val=c(4,2,6,3,4,5),
                algo=c("A","A","A","C","C","C"),
                id=c("james","james","james",
                     "james","james","james"))
df

我想改变数据框的结构,使其格式宽广。

id     algo.A    algo.C
james   4         3 
james   2         4
james   6         5

我为此尝试了tidyr,但得到以下错误。

> spread(df, id, algo)
Error: Duplicate identifiers for rows (1, 5)

有关如何获得所需结果的任何建议?

1 个答案:

答案 0 :(得分:3)

我们需要一个序列列,因为有重复的标识符。具体来说,spread无法知道algo的不同行应该是不同的,因为它们都具有id的相同值。在sep中指定spread参数允许我们获取列名称前缀:

library(tidyverse)
df %>%
    group_by(id, algo) %>%        
    mutate(rn = row_number()) %>%
    spread(algo, val, sep = ".") %>%
    select(-rn)
# A tibble: 3 x 3
# Groups:   id [1]
#   id    algo.A algo.C
#   <fct>  <dbl>  <dbl>
#1 james      4      3
#2 james      2      4
#3 james      6      5

数据

df <- data.frame(
    val = c(4, 2, 6, 3, 4, 5), 
    algo = c("A", "A", "A", "C", "C", "C"),
    id = c("james", "james", "james", "james", "james", "james")
)