如何将某些列转换为r中的行

时间:2017-07-07 10:52:20

标签: 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包,但我无法这样做。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)