R 保持样本配对的矩阵置换标号

R 保持样本配对的矩阵置换标号,r,perl,permutation,permute,R,Perl,Permutation,Permute,我有一个矩阵,有490行(特征;F1..F490)和350列(350个样本;s1..s350)。 第一列如下所示: Drug T T T C T Sample s1 s2 s3 s4 s5 ..... Pair 16 81 -16 32 -81 ..... Cond B D B B D ..... F1 34 23 12 9 ..... F2 78 11 87 10 ..... .

我有一个矩阵,有490行(特征;F1..F490)和350列(350个样本;s1..s350)。 第一列如下所示:

Drug    T   T   T   C   T
Sample  s1  s2  s3  s4  s5 .....
Pair    16  81 -16  32 -81 .....
Cond    B   D    B   B  D  .....
F1      34  23   12     9  .....
F2      78       11  87 10 .....
...
(缺少数据,这是正常的)

有两个条件;B和D。有两种药物(T和C)。 样本是成对的。例如,s1和s3是成对的,因为它们的对值相同(绝对值)

我想做的是,在保留配对信息(配对值)的同时,将药物标签排列1000次。因此,一对应该始终具有相同的条件(本例中为B)和相同的对值(本例中为16和-16)。此外,他们必须有相同的药物标签。实例s1和s3是一对;它们具有相同的对值,都是B,并且都有药物标签T

因此,1000个排列的文件中的1个应该是这样的,例如:

Drug    C   T   C   T   T
Sample  s1  s2  s3  s4  s5 .....
Pair    16  81 -16  32 -81 .....
Cond    B   D    B   B  D  .....
F1      34  23   12     9  .....
F2      78       11  87 10 .....
...
如果样品不整齐,我不介意

我尝试了permute和sample(在R中),但在包含上述条件的情况下,我似乎找不到一种方法来实现它。。如果这是显而易见的,我很抱歉

我想使用这些置换文件(n=1000)进行我已经编写的下游分析


非常感谢您的输入。

确定配对的列索引,找到与配对相关的药物,将药物洗牌,然后将洗牌后的药物分配回配对

use List::Util qw( shuffle );

my @matrix = (
   [ 'Drug',    'T',   'T',  'T',   'C',  'T',   ..... ],
   [ 'Sample',  's1',  's2', 's3',  's4', 's5',  ..... ],
   [ 'Pair',    '16',  '81', '-16', '32', '-81', ..... ],
   [ 'Cond',    'B',   'D',  'B',   'B',  'D',   ..... ],
   [ 'F1',      '34',  '23', '12',  '',   '9',   ..... ],
   [ 'F2',      '78',  '',   '11',  '87', '10',  ..... ],
);

my %pair_col_idxs_by_key;
{
   my $drug_row = $matrix[0];
   for my $col_idx (1..$#$drug_row) {
   my $row = $matrix[$col_idx];
   push @{ $pair_col_idxs_by_key{join(":", abs($row->[2]), $row->[3])} }, $pair_col_idxs;
}

my @all_pair_col_idxs = values(%pair_col_idxs_by_key);
my @drugs = map { $matrix[ 0 ][ $_->[0] ] } @all_pair_col_idxs;

@drugs = shuffle @drugs;

# Keep reshuffling until you get a previously unseen result.

for my $i (0..$#all_pair_col_idxs) {
   my $pair_col_idxs = $all_pair_col_idxs[$i];
   my $drug          = $drug[$i];

   $matrix[0][$_] = $drug for @$pair_col_idxs;
}

确定对的列索引,找到与对关联的药物,洗牌药物,然后将洗牌药物分配回对

use List::Util qw( shuffle );

my @matrix = (
   [ 'Drug',    'T',   'T',  'T',   'C',  'T',   ..... ],
   [ 'Sample',  's1',  's2', 's3',  's4', 's5',  ..... ],
   [ 'Pair',    '16',  '81', '-16', '32', '-81', ..... ],
   [ 'Cond',    'B',   'D',  'B',   'B',  'D',   ..... ],
   [ 'F1',      '34',  '23', '12',  '',   '9',   ..... ],
   [ 'F2',      '78',  '',   '11',  '87', '10',  ..... ],
);

my %pair_col_idxs_by_key;
{
   my $drug_row = $matrix[0];
   for my $col_idx (1..$#$drug_row) {
   my $row = $matrix[$col_idx];
   push @{ $pair_col_idxs_by_key{join(":", abs($row->[2]), $row->[3])} }, $pair_col_idxs;
}

my @all_pair_col_idxs = values(%pair_col_idxs_by_key);
my @drugs = map { $matrix[ 0 ][ $_->[0] ] } @all_pair_col_idxs;

@drugs = shuffle @drugs;

# Keep reshuffling until you get a previously unseen result.

for my $i (0..$#all_pair_col_idxs) {
   my $pair_col_idxs = $all_pair_col_idxs[$i];
   my $drug          = $drug[$i];

   $matrix[0][$_] = $drug for @$pair_col_idxs;
}

给定数据
df
。按
的绝对值分组,然后对分组的对进行采样/置换
药物
。最后在
对的绝对值上重新连接。使用
dplyr

t_df <- as.data.frame(t(df))                    # transposed to use features as cols
t_df$Pair <- as.numeric(as.character(t_df$Pair)

library(dplyr)

# Wrap this into a function to call/ permute 1000 times
df_out <- t_df %>% mutate(abs_pair = abs(Pair)) %>% 
              group_by(abs_pair) %>% filter(row_number()==1) %>% 
          ungroup() %>% mutate(Permuted_drug = sample(Drug, n())) %>%      
              select(abs_pair, Permuted_drug) %>%
          inner_join(t_df %>% mutate(abs_pair = abs(Pair)))

df_out
#  abs_pair Permuted_drug Drug  Sample  Pair Cond 
#     <dbl> <fct>         <fct> <fct>  <dbl> <fct>
#1       16 T             T     s1        16 B    
#2       16 T             T     s3       -16 B    
#3       81 C             T     s2        81 D    
#4       81 C             T     s5       -81 D    
#5       32 T             C     s4        32 B    
t_df%过滤器(行号()==1)%>%
解组()%%>%突变(置换药物=样本(药物,n())%%>%
选择(abs对、置换药物)%>%
内部连接(t_df%>%变异(abs_对=abs(对)))
df炣out
#abs\u对置换药物样品对条件
#                   
#1 16 T s1 16 B
#2 16 T T s3-16 B
#3 81 C T s2 81 D
#4 81 C T s5-81 D
#5 32 T C s4 32 B
使用的数据:


df给定数据
df
。按
的绝对值分组,然后对分组的对进行采样/置换
药物
。最后在
对的绝对值上重新连接。使用
dplyr

t_df <- as.data.frame(t(df))                    # transposed to use features as cols
t_df$Pair <- as.numeric(as.character(t_df$Pair)

library(dplyr)

# Wrap this into a function to call/ permute 1000 times
df_out <- t_df %>% mutate(abs_pair = abs(Pair)) %>% 
              group_by(abs_pair) %>% filter(row_number()==1) %>% 
          ungroup() %>% mutate(Permuted_drug = sample(Drug, n())) %>%      
              select(abs_pair, Permuted_drug) %>%
          inner_join(t_df %>% mutate(abs_pair = abs(Pair)))

df_out
#  abs_pair Permuted_drug Drug  Sample  Pair Cond 
#     <dbl> <fct>         <fct> <fct>  <dbl> <fct>
#1       16 T             T     s1        16 B    
#2       16 T             T     s3       -16 B    
#3       81 C             T     s2        81 D    
#4       81 C             T     s5       -81 D    
#5       32 T             C     s4        32 B    
t_df%过滤器(行号()==1)%>%
解组()%%>%突变(置换药物=样本(药物,n())%%>%
选择(abs对、置换药物)%>%
内部连接(t_df%>%变异(abs_对=abs(对)))
德福
#abs\u对置换药物样品对条件
#                   
#1 16 T s1 16 B
#2 16 T T s3-16 B
#3 81 C T s2 81 D
#4 81 C T s5-81 D
#5 32 T C s4 32 B
使用的数据:


df您是否只需要使用替换药物功能进行采样,并保持数据帧的其余部分不变??。只需对每个排列使用
样本(c(“T”,“c”),351,replace=TRUE)
,但配对的完整性不会受到影响吗?因为每个配对都必须有相同的药物标签(例如,s1和s3必须同时有T或C,但不是T和C)。对不起,不清楚,我在原来的问题中加了。好的。你现在有要求了。还有一件事,如果你有成对的样本。为什么样本总数是奇数。是否有任何一个样本未配对?再次抱歉。。我纠正了它;实际上有350个样本,但有351列,因为第一个用于特征名称等)一种方法:(1)记录所有配对(通过处理第一行)(2)逐个生成标题(“药物”)的排列(3)将每个配对与配对进行比较,如果弄糟了,则拒绝。(*)如果大多数是配对的,并且存在交叉配对,这可能太慢了,在这种情况下,您可以设计一个置换生成器来使用已知配对。您是否只需要使用替换药物特征进行采样,并保持数据框的其余部分不变??。只需对每个排列使用
样本(c(“T”,“c”),351,replace=TRUE)
,但配对的完整性不会受到影响吗?因为每个配对都必须有相同的药物标签(例如,s1和s3必须同时有T或C,但不是T和C)。对不起,不清楚,我在原来的问题中加了。好的。你现在有要求了。还有一件事,如果你有成对的样本。为什么样本总数是奇数。是否有任何一个样本未配对?再次抱歉。。我纠正了它;实际上有350个样本,但有351列,因为第一个用于特征名称等)一种方法:(1)记录所有配对(通过处理第一行)(2)逐个生成标题(“药物”)的排列(3)将每个配对与配对进行比较,如果弄糟了,则拒绝。(*)如果大多数是成对的,并且存在交叉配对,这可能太慢,在这种情况下,您可以设计一个置换生成器来使用已知配对。