【问题标题】:How would I go about creating this data frame? Would I need to use a nested for loop?我将如何创建这个数据框?我需要使用嵌套的 for 循环吗?
【发布时间】:2019-09-20 12:19:45
【问题描述】:

我正在尝试创建一个包含两列(ID、条件)的数据框。每个 ID 都与 8 个条件相关联。 ID 从 s009 开始,范围为 s050。对于每个 ID,我将有相同的一组条件。我已经包含了我要创建的示例集以供参考。我将不胜感激任何帮助。提前致谢!

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
...

【问题讨论】:

标签: r for-loop nested


【解决方案1】:

一个选项是expand.grid from 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")

【讨论】:

    【解决方案2】:

    我们可以创建两个向量,IDCodition 并使用 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
    

    我们也可以在base R中使用merge

    merge(ID, Condition)
    

    【讨论】:

    • 谢谢!如果我想将其导出为 .csv,我该怎么做?
    • @S.Basran 将其存储在变量out &lt;- merge(ID, Condition) 中,然后使用write.csv(out, "path/to/store/file.csv", row.names = NULL)
    【解决方案3】:

    这是另一个解决方案:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2017-11-26
      相关资源
      最近更新 更多