Разделение одного столбца на два столбца с использованием обработки данных с помощью R

Я был бы очень признателен за вашу помощь в использовании R для обработки данных. У меня есть данные, в которых я хочу разделить один столбец (переменную) на два, когда это возможно, в зависимости от других переменных. Например, согласно приведенному ниже образцу, данные представляют собой измерения времени реакции (RT1 и RT2) некоторых слов (элемента), которые появляются в разное время чтения (блок). Я хочу увидеть, коррелируются ли значения RT1 и RT2 в блоке 3, 4 и 5 со значениями RT1 и RT2 того же элемента в блоке 1. Целевые элементы, которые появлялись в блоке 1 и повторно появлялись в последующих блоках, кодируются как «EI» в столбце «состояние», тогда как элементы с кодом «E» или «I» появлялись только один раз.

dput(d1)
structure(list(RECORDING_SESSION_LABEL = c(26, 26, 26, 26, 26, 
26, 26, 26), RT1 = c(5171, 3857, 3447, 314, 460, 731, 957, 1253
), RT2 = c(357, 328, 122, 39, 86, 132, 173, 215), item = c("foreign", 
"detailed", "large", "foreign", "foreign", "large", "large", 
"disputable"), block = c(1, 1, 1, 3, 4, 3, 4, 3), condition = c("EI", 
"E", "EI", "EI", "EI", "EI", "EI", "I")), row.names = c(NA, -8L
), class = c("tbl_df", "tbl", "data.frame"))

Где образец данных будет выглядеть так:

> d1
# A tibble: 8 x 6
  RECORDING_SESSION_LABEL   RT1   RT2 item       block condition
                    <dbl> <dbl> <dbl> <chr>      <dbl> <chr>    
1                      26  5171   357 foreign        1 EI       
2                      26  3857   328 detailed       1 E        
3                      26  3447   122 large          1 EI       
4                      26   314    39 foreign        3 EI       
5                      26   460    86 foreign        4 EI       
6                      26   731   132 large          3 EI       
7                      26   957   173 large          4 EI       
8                      26  1253   215 disputable     3 I   

Чтобы представить в формате, понятном R, целевой фрейм данных, который я хочу достичь, должен быть аналогичен приведенному ниже (где должны быть добавлены выделенные столбцы). Строки в пробелах в этих столбцах представляют элементы, которые не появляются повторно (условие не кодируется как «EI»); следовательно, они не имеют отношения к делу и должны кодироваться как «NA».

dput(d2)
structure(list(RECORDING_SESSION_LABEL = c(26, 26, 26, 26, 26, 
26, 26, 26), `RT 1` = c(5171, 3857, 3447, 314, 460, 731, 957, 
1253), RT2 = c(357, 328, 122, 39, 86, 132, 173, 215), item = c("foreign", 
"detailed", "large", "foreign", "foreign", "large", "large", 
"disputable"), block = c(1, 1, 1, 3, 4, 3, 4, 3), condition = c("EI", 
"E", "EI", "EI", "EI", "EI", "EI", "I"), `RT 1_at_block1` = c(NA, 
NA, NA, 5171, 5171, 3447, 3447, NA), RT2_at_block1 = c(NA, NA, 
NA, 357, 357, 122, 122, NA)), row.names = c(NA, -8L), class = c("tbl_df", 
"tbl", "data.frame"))

Пример целевого формата данных будет выглядеть так:

> d2
# A tibble: 8 x 8
  RECORDING_SESSI~ `RT 1`   RT2 item  block condition `RT 1_at_block1`
             <dbl>  <dbl> <dbl> <chr> <dbl> <chr>                <dbl>
1               26   5171   357 fore~     1 EI                      NA
2               26   3857   328 deta~     1 E                       NA
3               26   3447   122 large     1 EI                      NA
4               26    314    39 fore~     3 EI                    5171
5               26    460    86 fore~     4 EI                    5171
6               26    731   132 large     3 EI                    3447
7               26    957   173 large     4 EI                    3447
8               26   1253   215 disp~     3 I                       NA
# ... with 1 more variable: RT2_at_block1 <dbl>

> head(d2)
# A tibble: 6 x 8
  RECORDING_SESSION_LABEL `RT 1`   RT2 item     block condition `RT 1_at_block1` RT2_at_block1
                    <dbl>  <dbl> <dbl> <chr>    <dbl> <chr>                <dbl>         <dbl>
1                      26   5171   357 foreign      1 EI                      NA            NA
2                      26   3857   328 detailed     1 E                       NA            NA
3                      26   3447   122 large        1 EI                      NA            NA
4                      26    314    39 foreign      3 EI                    5171           357
5                      26    460    86 foreign      4 EI                    5171           357
6                      26    731   132 large        3 EI                    3447           122

Заранее благодарю за любую помощь.


person azizi tamimi    schedule 09.02.2020    source источник
comment
Используйте dput для демонстрации примера вместо изображений. Благодарность   -  person akrun    schedule 09.02.2020
comment
Добавьте минимально воспроизводимый пример. Таким образом, вы можете помочь другим помочь вам! Кроме того, ваш вопрос непрост для понимания, будет приветствоваться MRE (с акцентом на минимальный), включая ожидаемые результаты!   -  person dario    schedule 09.02.2020
comment
спасибо за комментарий @dario, надеюсь, теперь он настроен правильно.   -  person azizi tamimi    schedule 09.02.2020
comment
Вы упоминаете, что: Строки в пробелах в этих столбцах представляют элементы, которые не появляются повторно (условие не кодируется как «EI»). Но в ваших d2 строках 1 и 3 есть NA в ваших новых столбцах, а условием является EI.   -  person Valeri Voev    schedule 09.02.2020
comment
@azizi tamimi Спасибо, выглядит хорошо. Теперь гораздо проще попытаться помочь вам!   -  person dario    schedule 09.02.2020
comment
Спасибо за комментарий @ValeriVoev. Вы правы и извините за путаницу, но я полагаю, что я не ввел их значения, потому что они не имеют отношения к анализу (я проверяю влияние RT1 и RT2 в блоке 1 на влияние RT1 и RT2 в блоке 2: 4 .   -  person azizi tamimi    schedule 10.02.2020


Ответы (1)


Возможное решение с использованием dplyr:

  d1 <- structure(list(RECORDING_SESSION_LABEL = c(26, 26, 26, 26, 26, 26, 26, 26),
                       RT1 = c(5171, 3857, 3447, 314, 460, 731, 957, 1253),
                       RT2 = c(357, 328, 122, 39, 86, 132, 173, 215),
                       item = c("foreign", "detailed", "large", "foreign", "foreign", "large", "large", "disputable"),
                       block = c(1, 1, 1, 3, 4, 3, 4, 3), condition = c("EI", "E", "EI", "EI", "EI", "EI", "EI", "I")),
                  row.names = c(NA, -8L), class = c("tbl_df", "tbl", "data.frame"))



  library(dplyr)

  d2 <- d1 %>% 
    left_join(d1 %>% filter(block == 1) %>% select(RECORDING_SESSION_LABEL, item, RT1_at_block1 = RT1)) %>% 
    left_join(d1 %>% filter(block == 1) %>% select(RECORDING_SESSION_LABEL, item, RT2_at_block1 = RT2))

После этого d2 выглядит так:

    RECORDING_SESSION_LABEL   RT1   RT2 item     block condition RT1_at_block1 RT2_at_block1
                      <dbl> <dbl> <dbl> <chr>    <dbl> <chr>             <dbl>         <dbl>
  1                      26  5171   357 foreign      1 EI                 5171           357
  2                      26  3857   328 detailed     1 E                  3857           328
  3                      26  3447   122 large        1 EI                 3447           122
  4                      26   314    39 foreign      3 EI                 5171           357
  5                      26   460    86 foreign      4 EI                 5171           357
  6                      26   731   132 large        3 EI                 3447           122

Изменить: добавление mutate, если вы хотите установить значения для блока 1 на NA:

d2 <- d1 %>% 
  left_join(d1 %>% filter(block == 1) %>% select(RECORDING_SESSION_LABEL, item, RT1_at_block1 = RT1)) %>% 
  left_join(d1 %>% filter(block == 1) %>% select(RECORDING_SESSION_LABEL, item, RT2_at_block1 = RT2)) %>% 
  mutate(RT1_at_block1 = ifelse(block == 1, NA, RT1_at_block1),
         RT2_at_block1 = ifelse(block == 1, NA, RT2_at_block1)) 
person dario    schedule 09.02.2020
comment
Большое спасибо за вашу помощь, время и усилия. Ваш код помог решить возникшую у меня проблему. - person azizi tamimi; 10.02.2020