根据R中的值传播记录

Spread record based on value in R

我无法仅根据 ID 传播数据 假设我有这个数据框

DF <- data.frame(ID=rep(c("1","2","3","1","2","1"), each=1),
             m=c(7,7,7,8,8,8),
             n=c(8,9,10,9,10,11),
             o=c(121,122,123,121,122,122),
             p=c(23,24,25,25,25,25)
             )

那我想根据ID来传播。这是我期望的输出

DFR <- data.frame(ID=rep(c("1","2","3"), each=1),
                m1=c(7,7,7),
                n1=c(8,9,10),
                o1=c(121,122,123),
                p1=c(23,24,25),
                m2=c(8,8,0),
                n2=c(9,10,0),
                o2=c(121,122,0),
                p2=c(25,25,0),
                m3=c(8,0,0),
                n3=c(11,0,0),
                o3=c(122,0,0),
                p3=c(25,0,0)
)

我尝试了一些代码,但大多数都失败了,例如

DF %>% fill(-ID) %>% 
        spread(key=m:p, value=m:p, sep="", fill=""); 

chop(DF, ID) %>%
     spread(DF, m:p) %>%
     unnest(c(m:p));

DF %>% group_by(ID) %>%
       select(ID) %>%
       mutate(row = paste0("m","n","o","p",row_number())) %>%
       spread(row, m,n,o,p);

任何解决方案将不胜感激。提前致谢

您可以使用:

library(dplyr)
library(tidyr)

DF %>%
  group_by(ID) %>%
  mutate(row = row_number()) %>%
  pivot_wider(names_from = row, values_from = m:p, values_fill = 0)

#   ID     m_1   m_2   m_3   n_1   n_2   n_3   o_1   o_2   o_3   p_1   p_2   p_3
#  <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1         7     8     8     8     9    11   121   121   122    23    25    25
#2 2         7     8     0     9    10     0   122   122     0    24    25     0
#3 3         7     0     0    10     0     0   123     0     0    25     0     0