我有一个像这样的数据框
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 :(得分: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)