Изменение формы данных в R . Можно ли иметь две "переменные значения"

Я борюсь с изменением формы пакета, ища способ "привести" к фрейму данных, но с двумя (или более) значениями в "value.var".

Вот пример того, чего я хочу добиться.

df <- data.frame( StudentID = c("x1", "x10", "x2", 
                            "x3", "x4", "x5", "x6", "x7", "x8", "x9"),
              StudentGender = c('F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'M'),
              ExamenYear    = c('2007','2007','2007','2008','2008','2008','2008','2009','2009','2009'),
              Exam          = c('algebra', 'stats', 'bio', 'algebra', 'algebra', 'stats', 'stats', 'algebra', 'bio', 'bio'),
              participated  = c('no','yes','yes','yes','no','yes','yes','yes','yes','yes'),  
              passed      = c('no','yes','yes','yes','no','yes','yes','yes','no','yes'),
              stringsAsFactors = FALSE)

Из df я могу создать следующий фрейм данных:

tx <- ddply(df, c('ExamenYear','StudentGender'), summarize,
        participated = sum(participated      == "yes"),
        passed   = sum(passed      == "yes"))

В логике изменения формы я принял участие и передал две "переменные значения"

Я ищу способ объединить в одном кадре следующую информацию:

 dcast(tx, formula = ExamenYear ~ StudentGender, value.var = 'participated')
 dcast(tx, formula = ExamenYear ~ StudentGender, value.var = 'passed')

Конечная таблица, которую я пытаюсь создать, будет выглядеть так

tempTab1 <- dcast(tx, formula = ExamenYear ~ StudentGender, value.var = 'participated')
tempTab2 <- dcast(tx, formula = ExamenYear ~ StudentGender, value.var = 'passed')

as.data.frame(cbind(ExamenYear = tempTab1[,1],
                Female_Participated = tempTab1[,2],
                Female_Passed       = tempTab2[,2],
                Male_Participated    = tempTab1[,3],
                Male_Passed          = tempTab2[,3]
                ))

Можно ли иметь две "переменные значения" в функции приведения?

1 ответ

Решение

Так как вы получили это далеко, почему бы и нет melt ваш tx объект и использование dcast следующее:

dcast(melt(tx, id.vars=c(1, 2)), ExamenYear ~ StudentGender + variable)
#   ExamenYear F_participated F_passed M_participated M_passed
# 1       2007              1        1              1        1
# 2       2008              1        1              2        2
# 3       2009             NA       NA              3        2

Более прямой подход, однако, вероятно, будет melt ваши данные с самого начала:

df.m <- melt(df, id.vars=c(1:4))
dcast(df.m, ExamenYear ~ StudentGender + variable, 
      function(x) sum(x == "yes"))
#   ExamenYear F_participated F_passed M_participated M_passed
# 1       2007              1        1              1        1
# 2       2008              1        1              2        2
# 3       2009              0        0              3        2

Обновление: подход Base R

Хотя требуемый код не такой "красивый", это не так уж сложно сделать в базе R. Вот один из подходов:

  1. использование aggregate() получить tx из вашего примера.

    dfa <- aggregate(cbind(participated, passed) ~ 
      ExamenYear + StudentGender, df, function(x) sum(x == "yes"))
    dfa
    #   ExamenYear StudentGender participated passed
    # 1       2007             F            1      1
    # 2       2008             F            1      1
    # 3       2007             M            1      1
    # 4       2008             M            2      2
    # 5       2009             M            3      2
    
  2. использование reshape преобразовывать dfa от "длинного" до "широкого".

    reshape(dfa, direction = "wide", 
            idvar="ExamenYear", timevar="StudentGender")
    #   ExamenYear participated.F passed.F participated.M passed.M
    # 1       2007              1        1              1        1
    # 2       2008              1        1              2        2
    # 5       2009             NA       NA              3        2
    
Другие вопросы по тегам