Как бы я пошел о создании этого фрейма данных? Нужно ли использовать вложенный цикл for? - PullRequest
2 голосов
/ 02 мая 2019

Я пытаюсь создать фрейм данных с двумя столбцами (идентификатор, условие). Каждый идентификатор связан с 8 условиями. Идентификатор начинается с s009 и будет варьироваться до s050. Для каждого идентификатора у меня будет одинаковый набор условий. Я включил образец набора того, что я должен создать для справки. Я был бы очень признателен за любую помощь с этим. Заранее спасибо!

ID     Condition
s009    Baseline
s009    Meditation
s009    Practice
s009    Creativity
s009    Preblock 1
s009    Postblock 1
s009    Preblock 2
s009    Postblock 2
s010    Baseline
s010    Mediation
s010    Practice 
s010    Creativity
s010    Preblock 1
s010    Postblock 1
s010    Preblock 2
s010    Postblock 2
s011    Baseline
...

Ответы [ 3 ]

2 голосов
/ 02 мая 2019

Один вариант будет expand.grid из base R (без использования каких-либо внешних пакетов)

df1 <- expand.grid(ID = v1, Condition = v2)

Или используя data.table

library(data.table)
CJ(ID = v1, Condition = v2)
#    ID   Condition
#  1: s009    Baseline
#  2: s009  Creativity
#  3: s009  Meditation
#  4: s009 Postblock 1
#  5: s009 Postblock 2
# ---                 
#332: s050 Postblock 1
#333: s050 Postblock 2
#334: s050    Practice
#335: s050  Preblock 1
#336: s050  Preblock 2

Или используя tidyverse

library(tidyverse)
tibble(ID = v1) %>% 
    expand(ID, Condition = v2)
# A tibble: 336 x 2
#   ID    Condition  
#   <chr> <chr>      
# 1 s009  Baseline   
# 2 s009  Creativity 
# 3 s009  Meditation 
# 4 s009  Postblock 1
# 5 s009  Postblock 2
# 6 s009  Practice   
# 7 s009  Preblock 1 
# 8 s009  Preblock 2 
# 9 s010  Baseline   
#10 s010  Creativity 
# … with 326 more rows

, где

v1 <- sprintf("s%03d", 9:50)
v2 <- c("Baseline", "Meditation", "Practice", "Creativity",
    "Preblock 1", "Postblock 1", "Preblock 2", "Postblock 2")
1 голос
/ 02 мая 2019

Мы можем создать два вектора, ID и Codition и использовать crossing

Condition <- c("Baseline","Meditation", "Practice", "Creativity" , "Preblock 1", 
             "Postblock 1", "Preblock 2", "Postblock 2")
ID <- paste0("s", sprintf("%03d", 9:50))

tidyr::crossing(ID, Condition)

#   ID    Condition  
#   <chr> <chr>      
# 1 s009  Baseline   
# 2 s009  Creativity 
# 3 s009  Meditation 
# 4 s009  Postblock 1
# 5 s009  Postblock 2
# 6 s009  Practice   
# 7 s009  Preblock 1 
# 8 s009  Preblock 2 
# 9 s010  Baseline   
#10 s010  Creativity 
# … with 326 more rows

Мы можем также использовать merge в базе R

merge(ID, Condition)
0 голосов
/ 02 мая 2019

Вот еще одно решение:

library(stringr)

ID <- sort(rep(paste0('s', str_pad(9:50, width=3, side='left', pad='0')),8))
Condition <- rep(c('Baseline', 'Meditation', 'Practice', 'Creativity', 'Preblock 1', 'Postblock 1', 'Preblock 2', 'Postblock 2'), 8*42)

df <- data.frame(ID, Condition)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...