2015-11-26 5 views
0

У меня есть два dfs, как dim [1] 54 210. Один (давайте назовем его dfx) содержит 1, 0s, чтобы отметить неправильные и правильные ответы на тест. dfy содержит время отклика для каждого из этих вопросов. Я хотел бы подмножество (merge() (возможно) все элементы из dfy, которые == 1 в dfx Данные в широком формате, ID = rownames и столбцов представляют каждый вопросзначения подмножества в df на основе значений в другом df

Пример:..

DFX

Q1 Q2 Q3 Q4 Q5 … 
1 1 1 1 1 
1 1 1 1 1 
1 1 0 1 1 
1 1 0 1 1 

DFY

Q1_3 Q2_3 Q3_3 Q4_3 Q5_3 ... 
16.01 8.23 18.13 11.14 18.03 
17.25 7.50 11.72 10.84 7.24 

Я бы нужен ДФЗ, который является подмножеством DFY, в котором, если dfx[Q1] == 1, dfy [Q1_3] возвращается как dfz[Q1_3], в противном случае NA или dfx[Q1] (что равно 0).

я могу это сделать, если я указываю COLS по

dfz<- cbind(ifelse(dfx$Q1 == 1, dfy$Q1_3, dfx$Q1)) 

однако я не знаю, как применить его для всей ФР.

Любые идеи?

+0

У вас есть уникальный идентификатор в ваших кадрах данных (я имею в виду, как столбец 'id', который позволяет вам сопоставлять каждую строку в' dfx' с строкой в ​​'dfy')? Или вы гарантируете, что порядок строк соответствует обоим кадрам данных? – Barranka

+0

@Barranka: Я могу вставить столбец id, однако rownames == для обоих dfs –

+0

Это может быть что-то простое, как 'dfy * dfx'. Если dfx имеет только одни и нули, то произведение обоих будет возвращать ноль для неверных ответов и значение 'dfy' для правильных. – Barranka

ответ

1

Если оба кадра данных имеют одинаковый размер, и dfx имеет только единицы и нули, вы можете умножить их, чтобы получить то, что вам нужно:

dfz <- dfy * dfx 

В следующий комментарий, вы спросите, как можно вы управляете столбцами из фрейма данных на основе значений другого фрейма данных. Я часто использую sqldf package для такого рода вещей. Это позволит вам манипулировать файлами данных с помощью инструкций SQL. Вам понадобится столбец id, который позволит вам связать ваши данные.

Простой пример:

library(sqldf) 
sqldf("select df_a.id 
      , case 
        when df_b.q1 = 1 then df_a.q1 
        else 0 
       end as value 
     from df_a 
      inner join df_b on df_a.id = df_b.id") 

Как вы можете видеть, вы можете присоединиться к dataframes, как если бы они были таблицы в базе данных.

Надеюсь, это поможет.

+0

, что действительно имеет смысл. Я едва знаком с R, и я не могу делать SQL, но вижу в нем логику. Большое спасибо :) –

+0

@CsabaSzavo С удовольствием помогите. Существует множество онлайн-ресурсов для обучения R. Я рекомендую вам [The Quick-R Tutorial] (http://statmethods.net).(Кстати, если вы считаете, что этот ответ был полезен, проголосовать за него, и/или принять его ;-)) – Barranka

+0

еще не успел, но я принял ответ ... :) спасибо –

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