R 保持样本配对的矩阵置换标号
我有一个矩阵,有490行(特征;F1..F490)和350列(350个样本;s1..s350)。 第一列如下所示: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 ..... .
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)将每个配对与配对进行比较,如果弄糟了,则拒绝。(*)如果大多数是成对的,并且存在交叉配对,这可能太慢,在这种情况下,您可以设计一个置换生成器来使用已知配对。