【问题标题】:long to wide format with multiples [duplicate]具有倍数的长到宽格式[重复]
【发布时间】:2018-10-18 16:52:33
【问题描述】:

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

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)

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

【问题讨论】:

    标签: r


    【解决方案1】:

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

    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")
    ) 
    

    【讨论】:

    • 感谢@CalumYou 的编辑。我重新排列了数据。
    猜你喜欢
    • 2020-05-18
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多