2017-07-07 63 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子名有很多因素,我们可以采取另一个数据框,然后做合并 –