Вот способ использования 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