2017-10-06 51 views
0

我有一組44 * .csv文件,每個文件都代表來自不同參與者的數據。每個文件的列名是相同的。我想按VarA過濾,以便x == T,然後隨機化VarB進行排列測試。然後我想連接44個文件。使用sample()和for循環來僞隨機數據R

例如

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循環是這樣做的最好方式,但我不熟悉這種方法。

回答

1

「randomize 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)) 
+0

這工作 - 謝謝!我已經編輯了這個問題,希望現在更清楚。 –

+0

我已經更新了我的答案以解釋排列測試。 – MrGumble