【问题标题】:Using sample() and for loops to pseudorandomize data in R使用 sample() 和 for 循环对 R 中的数据进行伪随机化
【发布时间】:2017-10-06 12:01:31
【问题描述】:

我有一组 44 个 *.csv 文件,每个文件代表来自不同参与者的数据。每个文件的列名相同。我想按 VarA 进行过滤,使 x == T,然后随机化 VarB 进行排列测试。然后我想连接这 44 个文件。

例如

 subj   VarA   VarB   filename
  1       T      a      1_a
  1       T      f      1_b
  2       T      g      2_a
  2       F      a      2_b

我之前通过先连接所有文件,然后使用代码随机化数据成功地做到了这一点

 data <- list.files(path = "./MyData/files/",
                    pattern="*.csv", 
                    full.names = T) %>% 
   map_df(function(x) read_csv(x, col_types = cols(.default = "c")) %>%
            mutate(filename=gsub(".csv","",basename(x)))) 

 new.data <- data %>% filter(VarA == T)

 new.data.scramble <- (sample(new.data$VarB))

但是,这不会在参与者内随机化。我相信 for 循环是最好的方法,但我不熟悉这种方法。

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    您所说的“随机化 VarB”是什么意思尚不清楚。您的代码示例只是对其进行了洗牌。你在做置换测试吗?

    除此之外,忠于你的榜样:

    你已经在使用dplyr,所以它只需要group_by,前提是参与者在数据框中被识别:

    data %>% filter(VarA == T) %>% group_by(filename) %>% sample_frac(size=1, replace=FALSE)
    

    但是,对于置换测试,这将不会打乱观察结果及其主题。为此,我们必须更新一列,但我们仍然可以这样做:

    data %>% filter(VarA == T) %>% group_by(filename) %>% mutate(varB=sample(varB))
    

    【讨论】:

    • 这行得通 - 谢谢!我已经编辑了这个问题,希望现在更清楚了。
    • 我已更新我的答案以考虑置换测试。
    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多