Как идентифицировать и объединить столбцы в фрейме данных R с соседним столбцом? - PullRequest
1 голос
/ 25 марта 2019

У меня есть данные о времени реакции из эксперимента в широком формате, где в каждой строке показаны данные от другого участника.В каждом столбце содержится информация о заданном вопросе (q01, q02 и т. Д.), Например:

   q01_response  q01_RT  q01_complete  q01_button  q02_response  q02_RT ...
1  yes           231     yes           m           yes           459
2  no            242     yes           c           yes           693

Я хотел бы объединить столбец ответов каждого вопроса (например, q01_response) со временем реакции того же вопроса (например, q01_RT), оставляя оставшиеся столбцы без изменений.Два столбца, которые я хочу объединить, всегда смежны.Таким образом, я бы хотел, чтобы фрейм данных выглядел так:

   q01_responsexRT  q01_complete  q01_button  q02_responsexRT ...
1  yesx231          yes           m           yesx459
2  nox242           yes           c           yesx693

Я знаю, как это сделать для двух конкретных столбцов:

df_new <- unite(df, "q01_responsexRT", c("q01_response","q01_RT"), sep="x")

Но я бы хотел избежатьделать это для каждой пары в отдельности.Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Вы также можете явно зациклить вопросы, если знаете, сколько вопросов нужно обработать.

library("tidyverse")
library("glue")

example <- "
q01_response  q01_RT  q01_complete  q01_button  q02_response  q02_RT
yes           231     yes           m           yes           459
no            242     yes           c           yes           693
"

unite_response_time <- function(df, q) {
  in_cols <- c(glue("{q}_response"), glue("{q}_RT"))
  out_col <- glue("{q}_responsexRT")
  df %>% unite(!!out_col, in_cols, sep = "x")
}

df <- read_table(example)

for (q in c("q01", "q02")) {
  df <- unite_response_time(df, q)
}
df
#> # A tibble: 2 x 4
#>   q01_responsexRT q01_complete q01_button q02_responsexRT
#>   <chr>           <chr>        <chr>      <chr>          
#> 1 yesx231         yes          m          yesx459        
#> 2 nox242          yes          c          yesx693

# or

df <- read_table(example)

for (i in seq(2)) {
  q <- sprintf("q%02d", i)
  df <- unite_response_time(df, q)
}
df
#> # A tibble: 2 x 4
#>   q01_responsexRT q01_complete q01_button q02_responsexRT
#>   <chr>           <chr>        <chr>      <chr>          
#> 1 yesx231         yes          m          yesx459        
#> 2 nox242          yes          c          yesx693

Создано в 2019-03-25 пакетом представ. (v0.2.1)

0 голосов
/ 25 марта 2019

Вот способ использования tidyverse:

library(tidyverse)
df1 <- read.table(h=T, strin=F, text="
q01_response  q01_RT  q01_complete  q01_button  q02_response  q02_RT
1  yes           231     yes           m           yes           459
2  no            242     yes           c           yes           693")

mutate(df1, !!!map2_dfc(
  select(df1, ends_with("_response")), 
  select(df1, ends_with("_RT")),
  paste, sep ="x")) %>%
  select(-ends_with("_RT")) %>%
  rename_at(vars(ends_with("_response")),paste0,"xRT")

#   q01_responsexRT q01_complete q01_button q02_responsexRT
# 1         yesx231          yes          m         yesx459
# 2          nox242          yes          c         yesx693

Предполагается, что у вас одинаковое количество столбцов response и RT и в правильном порядке (то есть он не проверяет префиксы столбцов).

  • Наши первые вызовы select создают 2 подмножества фреймов данных с соответствующими суффиксами
  • map2_dfc перебирает эти столбцы, вставляя их, сохраняя имена из первого фрейма данных.
  • !!! объединяет результирующий фрейм данных в список q01_response =... и т. Д.
  • Затем мы удаляем лишние столбцы и переименовываем недавно обновленные

А вот несколько более «идиоматическая» версия, более надежная, поскольку она рассматривает как префиксы, так и суффиксы, содержащие большое количество gather / spread джиу-джитсу:

df1 %>%
  rowid_to_column() %>% 
  gather(key,value, -rowid) %>%
  separate(key,c("q","key2"))  %>%
  spread(key2,value) %>%
  unite(responsexRT, response, RT, sep = "x") %>%
  gather(key2,value, -rowid, -q) %>%
  unite(key, q, key2, sep ="x") %>%
  spread(key,value) %>%
  select(-rowid)

#   q01xbutton q01xcomplete q01xresponsexRT q02xbutton q02xcomplete q02xresponsexRT
# 1          m          yes         yesx231       <NA>         <NA>         yesx459
# 2          c          yes          nox242       <NA>         <NA>         yesx693
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...