首页 > 解决方案 > 将数据框 8 行重塑为 2 行

问题描述

df<-structure(list(AC_NAME = c("Behat", "Behat", "Behat", "Behat", 
"Nakur", "Nakur", "Nakur", "Nakur"), CAND_NAME = c("MAHAVEER SINGH RANA", 
"NARESH", "UMAR ALI KHAN", "AJAY CHAUHAN", "DR. DHARAM SINGH SAINI", 
"IMRAN MASOOD", "FIROZ AFTAB", "GOVIND CHOUDHARY"), PARTYABBRE = c("BSP", 
"INC", "SP", "BJP", "BSP", "INC", "SP", "IND"), TOTVOTPOLL = c(70274, 
69760, 47366, 23623, 89187, 84623, 29503, 14226), POSITION = c(1, 
2, 3, 4, 1, 2, 3, 4)), row.names = c(NA, 8L), class = "data.frame")

>df 
  AC_NAME              CAND_NAME PARTYABBRE TOTVOTPOLL POSITION
1   Behat    MAHAVEER SINGH RANA        BSP      70274        1
2   Behat                 NARESH        INC      69760        2
3   Behat          UMAR ALI KHAN         SP      47366        3
4   Behat           AJAY CHAUHAN        BJP      23623        4
5   Nakur DR. DHARAM SINGH SAINI        BSP      89187        1
6   Nakur           IMRAN MASOOD        INC      84623        2
7   Nakur            FIROZ AFTAB         SP      29503        3
8   Nakur       GOVIND CHOUDHARY        IND      14226        4

我希望它像这样重塑。

data
  AC_NAME        Candidate_Rank1 Candidate_Rank2 Candidate_Rank3  Candidate_Rank4 Party_Rank1 Party_Rank2 Party_Rank3 Party_Rank4 Votes_Rank1 Votes_Rank2 Votes_Rank3
1   Behat    MAHAVEER SINGH RANA          NARESH   UMAR ALI KHAN     AJAY CHAUHAN         BSP         INC          SP         BJP       70274       69760       47366
2   Nakur DR. DHARAM SINGH SAINI    IMRAN MASOOD     FIROZ AFTAB GOVIND CHOUDHARY         BSP         INC          SP         IND       89187       84623       29503
  Votes_Rank4 Poistion1 Poistion2 Poistion3 Poistion4
1       23623         1         2         3         4
2       14226         1         2         3         4

我试过了dcast。使用它我有更多的列。我认为它不会在这里工作我不确定。有人指导我。我不介意列名与我的相同,以后可以更改。

dd <- dcast(data, AC_NAME+CAND_NAME ~POSITION ,value.var = "POSITION")             

标签: r

解决方案


你可以使用dcast-

library(data.table)
dcast(setDT(df), AC_NAME ~POSITION ,
      value.var = c('CAND_NAME', 'PARTYABBRE', 'TOTVOTPOLL'))  

#   AC_NAME            CAND_NAME_1  CAND_NAME_2   CAND_NAME_3      CAND_NAME_4 PARTYABBRE_1 PARTYABBRE_2
#1:   Behat    MAHAVEER SINGH RANA       NARESH UMAR ALI KHAN     AJAY CHAUHAN          BSP          INC
#2:   Nakur DR. DHARAM SINGH SAINI IMRAN MASOOD   FIROZ AFTAB GOVIND CHOUDHARY          BSP          INC

#   PARTYABBRE_3 PARTYABBRE_4 TOTVOTPOLL_1 TOTVOTPOLL_2 TOTVOTPOLL_3 TOTVOTPOLL_4
#1:           SP          BJP        70274        69760        47366        23623
#2:           SP          IND        89187        84623        29503        14226

或使用tidyr::pivot_wider.

tidyr::pivot_wider(df, names_from = POSITION, values_from = c(CAND_NAME, PARTYABBRE, TOTVOTPOLL))

POSITIONvalue 已包含在新数据框的列名中。


推荐阅读