基于与原始因子的“子因子”的特定水平相对应的值,对R中的因子进行重新排序

问题描述

我在R中有一个具有以下结构的数据集:

sub ses

sub1 0 .1454

sub1 1 .0857

sub2 0 .1123

sub2 1 .2345

sub3 0 .2105

sub3 1 .0665

df <- data.frame(sub=c("sub1","sub1","sub2","sub3","sub3"),ses=c(0,1,1),value=c(.1454,.0857,.1123,.2345,.2105,.0665))

出于绘制会话0和会话1之间的值变化的目的,我有兴趣对数据集进行重新排序,以便Sub的顺序反映变量Value only 对于Ses == 0 in 降序顺序,因此您可以轻松地可视化跨主题的“基线”(Ses == 0)值的差异,同时将每个主题的两个值都保留在数据框中:

sub ses

sub2 0 .1123

sub2 1 .2345

sub1 0 .1454

sub1 1 .0857

sub3 0 .2105

sub3 1 .0665

df <- data.frame(sub=c("sub2",value=c(.1123,.1454,.0665))

对于相当大的数据集,这证明是不平凡的解决方案。我想要类似的东西

df.ordered <- df %>% group_by(sub) %>% arrange(desc(ses == 0,.by_group=TRUE))

,但是此语法不正确,因为您不能以这种方式指定ses的值(在这种情况下,它将仅按ses重新排序)。非常感谢任何可以给我指导的人。谢谢!

解决方法

我们可以在arrange上使用factor并根据我们要订购的自定义值使用levels

library(dplyr)
df %>%
   dplyr::arrange(factor(sub,levels = 
               unique(sub[ses ==0][order(value[ses == 0])])))
#  sub ses  value
#1 sub2   0 0.1123
#2 sub2   1 0.2345
#3 sub1   0 0.1454
#4 sub1   1 0.0857
#5 sub3   0 0.2105
#6 sub3   1 0.0665
,

您可以首先仅过滤0个值并按arrange排列它们,以提取想要value数据的正确顺序

library(dplyr)
correct_order <- df %>%
                  filter(ses == 0) %>%
                  arrange(value) %>%
                  pull(sub)
correct_order
#[1] "sub2" "sub1" "sub3"

然后您可以使用arrange match来>>

df %>% arrange(match(sub,correct_order),ses)
#  sub ses  value
#1 sub2   0 0.1123
#2 sub2   1 0.2345
#3 sub1   0 0.1454
#4 sub1   1 0.0857
#5 sub3   0 0.2105
#6 sub3   1 0.0665