Использование частичных строк для создания новых переменных (репост)

Я надеялся, что смогу придумать, как преобразовать мои данные в длинную форму в R.

Я хотел бы отделить условие, хромофор и детектор источника от имен переменных в моем фреймворке данных. Ниже я вставил несколько примеров (но во фрейме данных гораздо больше переменных). Поэтому мне нужно выбрать Angry и Happy и поместить их в переменную Condition, затем хромофоры Hbo, HbR и Hbt и, наконец, пары детектора источника 1,1, 1,2 (возможно, поиск и извлечение текста до и после запятой, потому что у меня их 49 комбинаций).

Примеры имен переменных:

AngryHRFHbO, 1,1 AngryHRFHbR, 1,1 AngryHRFHbT, 1,1 AngryHRFHbO, 2,1 AngryHRFHbR, 2,1 AngryHRFHbT, 2,1 HappyHRFHbO, 4,1 HappyHRFHbR, 4,1 HappyHRFHbT, 4,1 Happy, 2,2HR HRFHbR, 2,2 HappyHRFHbT, 2,2

Спасибо за помощь!

Всего наилучшего, Кэролайн


person Caroline    schedule 13.08.2020    source источник


Ответы (2)


Я сделал аналогичные данные для ваших данных, описанных выше

library(tidyverse)
library(stringr)
df <- data.frame(obs = 1, "AngryHRFHbO,1,1"  = 1,  "AngryHRFHbR,1,1" = 0, "AngryHRFHbT,1,1" = 3,  "AngryHRFHbO,2,1" = 9, "AngryHRFHbR,2,1" = 0, "HappyHRFHbT,4,1" = 4)
# obs AngryHRFHbO.1.1 AngryHRFHbR.1.1 AngryHRFHbT.1.1 AngryHRFHbO.2.1 AngryHRFHbR.2.1 HappyHRFHbT.4.1
# 1   1               1               0               3               9               0               4

Это подход, который вы можете использовать для решения своего вопроса

df2 <- df %>% 
  pivot_longer(-obs, names_to = "Name", values_to = "Value") %>% 
  mutate(Name = str_replace_all(Name, regex("\\."), ",")) %>%  #you can ignore this line if the variables have the comma
  mutate(Condition = str_extract(Name, regex("Angry|Happy")),
         Chromophore = str_extract(Name, regex("Hbo|HbR|Hbt", ignore_case = TRUE)),
         detector = str_extract(Name, regex("\\d[,]\\d$"))) %>% 
  select(-c(obs, Value))
# Name            Condition Chromophore detector
# <chr>           <chr>     <chr>       <chr>   
# 1 AngryHRFHbO,1,1 Angry     HbO         1,1     
# 2 AngryHRFHbR,1,1 Angry     HbR         1,1     
# 3 AngryHRFHbT,1,1 Angry     HbT         1,1     
# 4 AngryHRFHbO,2,1 Angry     HbO         2,1     
# 5 AngryHRFHbR,2,1 Angry     HbR         2,1     
# 6 HappyHRFHbT,4,1 Happy     HbT         4,1 
person Tho Vu    schedule 13.08.2020

Спасибо за помощь! Я смог использовать это, чтобы прийти к нужному мне выводу. Увидеть ниже:

df2 <- full_data %>% 
pivot_longer(-c("ID", "time"),  names_to = "Name", values_to = "Value") %>% 
mutate(Name = str_replace_all(Name, regex("\\."), "_")) %>%  #you can ignore this line 
if the variables have the comma
mutate(Condition = str_extract(Name, regex("Angry|Happy|Fearful")),
     Chromophore = str_extract(Name, regex("HbO|HbR|HbT", ignore_case = TRUE)),
     Channel = str_extract_all(Name, regex("\\d+[_]\\d+$"))) %>% 
select(c("ID", "time", "Name", "Condition", "Chromophore", "Channel", "Value"))
person Caroline    schedule 02.09.2020