2016-03-09 2 views
0

У меня есть некоторые данные точек студент экзамен:упорядочения значений на одной строке в R dataframe dplyr

 MAPPING PupilMatchingRefAnonymous POINTS 
1 PHYS  1      60 
2 COMP  1      40 
3 ENGL  1      20 
4 MATH  1      80 

Я хочу, чтобы добавить математику каждого студента и английские оценки каждому из своих экзаменов для легкого сравнения:

MAPPING PupilMatchingRefAnonymous POINTS MATH ENGL 
1 PHYS  1      60 80  20 
2 COMP  1      40 80  20 
3 ENGL  1      20 80  20 
4 MATH  1      80 80  20 

Я попытался следующий код, но не повезло:

comResults %>% 
    select(MAPPING, PupilMatchingRefAnonymous, POINTS) %>% 
    group_by(PupilMatchingRefAnonymous) %>% 
    mutate(MATH=ifelse(MAPPING=="MATH", POINTS, NA)) 

    Error: incompatible types, expecting a numeric vector 

Любая идея, что я не должен пытаться?

ответ

1

Я думаю, вы пытаетесь перенести его из длинной формы в широкую форму, верно?

Если это так, попробуйте это:

library(tidyr) 
new.df <- comResults %>% 
    spread(MAPPING, POINTS) 

Это сделает 1 учащегося 1 ряд со всеми их научной информации в той же строке. Я знаю, что вы хотели только Math и английский, но, возможно, этот код поможет вам на правильном пути.

+1

Я думал, спрэд часть 'dplyr', но я могу ошибаться. Честно говоря, я просто загружаю 'dplyr' и' tidyr' вместе. Я добавил 'tidyr' к моему ответу для уточнения. Редактировать: yep Я неправильно читаю информацию о распространении() из R. Это определенно 'tidyr' – Pete

2

Я не знаю, как dplyr обрабатывает слияния, но это решение базового R будет производить результат (менее имена, whch должны быть достаточно просто исправить :)

merge(merge(dat, dat[dat$MAPPING=="MATH", -1], by='PupilMatchingRefAnonymous'), 
     dat[dat$MAPPING=="ENGL", -1] , by='PupilMatchingRefAnonymous') 
#-------- 
    PupilMatchingRefAnonymous MAPPING POINTS.x POINTS.y POINTS 
1       1 PHYS  60  80  20 
2       1 COMP  40  80  20 
3       1 ENGL  20  80  20 
4       1 MATH  80  80  20 

Вот два студента набора данных для дальнейшего тестирования:

dput(dat) 
structure(list(MAPPING = structure(c(4L, 1L, 2L, 3L, 4L, 1L, 
2L, 3L), .Label = c("COMP", "ENGL", "MATH", "PHYS"), class = "factor"), 
    PupilMatchingRefAnonymous = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
    2L), POINTS = c(60L, 40L, 20L, 80L, 20L, 40L, 0L, 80L)), .Names = c("MAPPING", 
"PupilMatchingRefAnonymous", "POINTS"), class = "data.frame", row.names = c(NA, 
-8L)) 
+0

Это не обобщает. Вам нужно будет сделать это для каждой строки –

+0

@ Давид: Я не понимаю. Вы говорите, что в случае более чем одного значения для PupilMatchingRefAnonymous, что слияние произойдет неправильно? –

+0

Я говорю, что вы явно называете 'dat $ MAPPING ==" ENGL "', 'dat $ MAPPING ==" MATH "и т. Д. При слиянии. Это означает, что вам нужно будет явно указать * каждое * значение переменной «MAPPING», чтобы создать все столбцы. Разве у вас есть способ обобщить это? –

3

Используя базу, это, кажется, довольно прямо вперед

df[as.character(df$MAPPING)] <- rep(df$POINTS, each = nrow(df)) 
df 
# MAPPING PupilMatchingRefAnonymous POINTS PHYS COMP ENGL MATH 
# 1 PHYS       1  60 60 40 20 80 
# 2 COMP       1  40 60 40 20 80 
# 3 ENGL       1  20 60 40 20 80 
# 4 MATH       1  80 60 40 20 80 
+0

Вы пробовали это с двумя наборами данных для студентов? –

Смежные вопросы