2017-07-07 62 views
0

我有這樣如何某些列轉換爲行中的R

Htno   Subname    marks  credits 
15mq1a0501  abc    43   3 
15mq1a0501  xyz    55   6 
15mq1a0502  abc    56   3 
15mq1a0502  xyz    60   6 
15mq1a0503  abc    10   0 
15mq1a0503  xyz    56   6 

現在我需要一個數據幀的數據幀被轉換這樣

Htno    abc   xyz  Totalmarks  Totalcredits 
15mq1a0501   43   55   98     9 
15mq1a0502   56   60  116     9 
15mq1a0503   10   56   66     6 

我用dplyr包,但我我無法這樣做。

回答

0

您可以使用下列內容:

require(tidyverse) 
df %>% 
    spread(Subname, marks) %>% 
    group_by(HTno) %>% 
    summarise(abc = max(abc, na.rm = T), xyz = max(xyz, na.rm = T), Totalcredits = sum(credits)) %>% 
    mutate(Totalmarks = abc + xyz) 

其結果將是:

 HTno abc xyz Totalcredits Totalmarks 
     <fctr> <dbl> <dbl>  <dbl>  <dbl> 
1 15mq1a0501 43 55   9   98 
2 15mq1a0502 56 60   9  116 
3 15mq1a0503 10 56   6   66 
0

只是一個只使用dplyr功能替代。請注意,當Subname有許多因素時,解決方案可能會很乏味。看看別人是否可以有更通用的解決方案。

library(magrittr) 
library(dplyr) 

df %>% group_by(Htno) %>% 
    summarize(abc = marks[Subname == "abc"], 
      xyz = marks[Subname == "xyz"], 
      Totalmarks = sum(marks), 
      Totalcredits = sum(credits)) 

編輯:下面概括的作品,但它更復雜,需要tidyr::spread

library(magrittr) 
library(dplyr) 

library(tidyr)  
df_1 <- df %>% group_by(Htno) %>% 
    summarize(Totalmarks = sum(marks), 
      Totalcredits = sum(credits)) 

df_2 <- df %>% select(-credits) %>% spread(Subname, marks) %>% 
    group_by(Htno) %>% summarize_each(funs(mean)) 

left_join(df_2, df_1, by = "Htno", all = TRUE) 
+0

謝謝you.it working.If子名有很多因素,我們可以採取另一個數據框,然後做合併 –