Merging multiple rows into single row

后端 未结 2 1017
慢半拍i
慢半拍i 2021-01-16 04:26

I\'ve some problems with my data frame in R. My data frame looks something like this:

ID  TIME    DAY        URL_NAME      VALUE  TIME_SPEND
1    12:15  Mond         


        
2条回答
  •  野的像风
    2021-01-16 04:43

    Try this tidyverse solution which will produce an output close to what you want. You can group by TIME then create a sequential id that will identify the future columns. After that reshape to long (pivot_longer()) combine the variable name with the id and then reshape to wide (pivot_wider()). Here's the code where I have used a dataset of my own,

    df1 <- data.frame(Components = c(rep("ABC",5),rep("BCD",5)), 
                  Size = c(sample(1:100,5),sample(45:100,5)),
                  Age = c(sample(1:100,5),sample(45:100,5)))
    

    For the above-generated data set, the following code piece is the solution:

    library(tidyverse)
    #Code
    newdf <- df1 %>% group_by(Components) %>% mutate(id=row_number()) %>%
      pivot_longer(-c(Components,id)) %>%
      mutate(name=paste0(name,'.',id)) %>% select(-id) %>%
      pivot_wider(names_from = name,values_from=value)
    

    OUTPUT would look like:

    # A tibble: 2 x 11
    # Groups:   Components [2]
      Components Size.1 Age.1 Size.2 Age.2 Size.3 Age.3 Size.4 Age.4 Size.5 Age.5
                          
    1 ABC            23    94     52    89     15    25     76    38     33    99
    2 BCD            59    62     55    81     81    61     80    83     97    68
    

    ALTERNATIVE SOLUTION:

    We could use unite to unite the columns and then use pivot_wider

    library(dplyr)
    library(tidyr)
    library(data.table)
    df1 %>%
       mutate(rn = rowid(Components)) %>%
       pivot_longer(cols = Size:Age) %>% 
       unite(name, name, rn, sep=".") %>%
       pivot_wider(names_from = name, values_from = value)
    

    OUTPUT would look like:

    # A tibble: 2 x 11
    #  Components Size.1 Age.1 Size.2 Age.2 Size.3 Age.3 Size.4 Age.4 Size.5 Age.5
    #                      
    #1 ABC            11    16     79    57     70     2     80     6     91    24
    #2 BCD            67    81     63    77     48    73     52   100     49    76
    

    Both the solutions were @Duck's Duck's Profile URL and @akrun's Akrun's Profile URL brainchild. Thanks a tonne to them.

提交回复
热议问题