如何命令列的变量交替?
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
我建议您应该始终在数据中对问题编号进行编码,以便您可以在整个分析过程中对它们进行任意排序。当在列或列组合中不能立即辨别时,切勿依赖行的顺序来有意义和保留。
附加栏目:
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
如果你真的必须避免在那里保留问题编号,那么我们可以内化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), ]
假设定位清晰,这基本上交换了数据集中的所有对。
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
我建议您应该始终在数据中对问题编号进行编码,以便您可以在整个分析过程中对它们进行任意排序。当在列或列组合中不能立即辨别时,切勿依赖行的顺序来有意义和保留。
附加栏目:
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
如果你真的必须避免在那里保留问题编号,那么我们可以内化
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), ]
假设定位清晰,这基本上交换了数据集中的所有对。