如何命令列的变量交替?

How do I order the variables of a column to alternate?

dataframe

如何重新排列列,以便我可以先获得“pre”,然后是“post”,然后再次交替?每个“pre”和“post”条目都与调查中的一个问题相关。因此,例如,第一个“pre”和“post”都是调查问题 1 的答案。我想比较“pre”和“post”的答案,出于组织目的,想知道如何让该列先显示 pre,然后显示 pro,然后按该顺序交替显示。谢谢!

假数据:

dat <- data.frame(Time = rep(c("Post","Pre"), 3), Num = 1:6)
dat
#   Time Num
# 1 Post   1
# 2  Pre   2
# 3 Post   3
# 4  Pre   4
# 5 Post   5
# 6  Pre   6
  1. 我建议您应该始终在数据中对问题编号进行编码,以便您可以在整个分析过程中对它们进行任意排序。当在列或列组合中不能立即辨别时,切勿依赖行的顺序来有意义和保留。

    附加栏目:

    dat$QuestionNumber <- rep(1:(nrow(dat)/2), each = 2)
    dat
    #   Time Num QuestionNumber
    # 1 Post   1              1
    # 2  Pre   2              1
    # 3 Post   3              2
    # 4  Pre   4              2
    # 5 Post   5              3
    # 6  Pre   6              3
    

    不幸的是,在排序字符串时不能使用否定,所以 match 的使用是一种快速破解:

    dat[order(dat$QuestionNumber, -match(dat$Time, sort(unique(dat$Time)))),]
    #   Time Num QuestionNumber
    # 2  Pre   2              1
    # 1 Post   1              1
    # 4  Pre   4              2
    # 3 Post   3              2
    # 6  Pre   6              3
    # 5 Post   5              3
    

    或者,您可以使用“radix”排序方法并提供每列 decreasing= 个参数。

    dat[order(dat$QuestionNumber, dat$Time, method = "radix", decreasing = c(FALSE, TRUE)),]
    #   Time Num QuestionNumber
    # 2  Pre   2              1
    # 1 Post   1              1
    # 4  Pre   4              2
    # 3 Post   3              2
    # 6  Pre   6              3
    # 5 Post   5              3
    
  2. 如果你真的必须避免在那里保留问题编号,那么我们可以内化QuestionNumber 逻辑 进入 order 调用,尽管它可能会让人很难看清发生了什么。

    dat$QuestionNumber <- NULL
    dat[order(rep(1:(nrow(dat)/2), each = 2), dat$Time,
              method = "radix", decreasing = c(FALSE, TRUE)),]
    #   Time Num
    # 2  Pre   2
    # 1 Post   1
    # 4  Pre   4
    # 3 Post   3
    # 6  Pre   6
    # 5 Post   5
    

如果要按第 2、1、4、3、6、5 等行显示,可以使用:

dt <- dt[1:nrow(dt) + (-1)^(1:nrow(dt) + 1), ]

假设定位清晰,这基本上交换了数据集中的所有对。