我有下面的数据框架。这些行目前是以物种组的形式排序的,即高粱组,紧随其后的是豆科组。
# create a dataset
specie <- c(rep("sorgho" , 3) , rep("poacee" , 3) , rep("banana" , 3) , rep("triticum" , 3) )
condition <- rep(c("normal" , "stress" , "Nitrogen") , 4)
value <- abs(rnorm(12 , 0 , 15))
data <- data.frame(specie,condition,value)
print(data)
specie condition value
1 sorgho normal 12.623696
2 sorgho stress 11.394047
3 sorgho Nitrogen 0.498003
4 poacee normal 14.589322
5 poacee stress 10.744153
6 poacee Nitrogen 7.299742
7 banana normal 9.845850
8 banana stress 9.416088
9 banana Nitrogen 4.178521
10 triticum normal 13.230663
11 triticum stress 30.658355
12 triticum Nitrogen 9.402721我如何重新排列这些分组,使它们按氮值递减的顺序排列?我希望重新组织数据框,使其类似于以下内容:
specie condition value
10 triticum normal 13.230663
11 triticum stress 30.658355
12 triticum Nitrogen 9.402721
4 poacee normal 14.589322
5 poacee stress 10.744153
6 poacee Nitrogen 7.299742
7 banana normal 9.845850
8 banana stress 9.416088
9 banana Nitrogen 4.178521
1 sorgho normal 12.623696
2 sorgho stress 11.394047
3 sorgho Nitrogen 0.498003发布于 2020-12-04 07:43:59
我们可以按降序排列‘filter’行,‘arrange’值,提取‘levels’并将其用作‘排列’列的值
library(dplyr)
lvls <- data %>%
filter(condition == 'Nitrogen') %>%
arrange(desc(value)) %>%
pull(specie)
data %>%
arrange(factor(specie, levels = lvls))%>%
as_tibble-output
# A tibble: 12 x 3
# specie condition value
# <chr> <chr> <dbl>
# 1 triticum normal 13.2
# 2 triticum stress 30.7
# 3 triticum Nitrogen 9.40
# 4 poacee normal 14.6
# 5 poacee stress 10.7
# 6 poacee Nitrogen 7.30
# 7 banana normal 9.85
# 8 banana stress 9.42
# 9 banana Nitrogen 4.18
#10 sorgho normal 12.6
#11 sorgho stress 11.4
#12 sorgho Nitrogen 0.498或者在单个管道中执行此操作
data %>%
arrange(factor(specie, levels =
unique(specie)[order(-value[condition == 'Nitrogen'])]))或者使用base R
data[order(with(data, factor(specie, levels =
unique(specie)[order(-value[condition == "Nitrogen"])]))),]数据
data <- structure(list(specie = c("sorgho", "sorgho", "sorgho", "poacee",
"poacee", "poacee", "banana", "banana", "banana", "triticum",
"triticum", "triticum"), condition = c("normal", "stress", "Nitrogen",
"normal", "stress", "Nitrogen", "normal", "stress", "Nitrogen",
"normal", "stress", "Nitrogen"), value = c(12.623696, 11.394047,
0.498003, 14.589322, 10.744153, 7.299742, 9.84585, 9.416088,
4.178521, 13.230663, 30.658355, 9.402721)), class = "data.frame",
row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))发布于 2020-12-04 08:23:52
另一个基础R选项(不如@akrun的基础R解决方案优雅)
with(
data,
do.call(
rbind,
split(data, factor(specie, levels = unique(specie)))[order(-value[condition == "Nitrogen"])]
)
)这给了我们
specie condition value
triticum.10 triticum normal 13.230663
triticum.11 triticum stress 30.658355
triticum.12 triticum Nitrogen 9.402721
poacee.4 poacee normal 14.589322
poacee.5 poacee stress 10.744153
poacee.6 poacee Nitrogen 7.299742
banana.7 banana normal 9.845850
banana.8 banana stress 9.416088
banana.9 banana Nitrogen 4.178521
sorgho.1 sorgho normal 12.623696
sorgho.2 sorgho stress 11.394047
sorgho.3 sorgho Nitrogen 0.498003发布于 2020-12-04 10:29:12
这可以使用data.table很容易地完成。我们首先以所需的顺序获取specie的单列data.table。然后,以data.table方式进行合并将会给出所需的输出。对于dt.ordered中的每个specie值,将返回来自data的匹配行。因此,specie列在最终输出中的顺序由dt.ordered中的顺序决定。
library(data.table)
setDT(data)
dt.ordered <- data[condition == 'Nitrogen', .(specie = specie[order(-value)])]
# > dt.ordered
# specie
# 1: triticum
# 2: poacee
# 3: banana
# 4: sorgho
data[dt.ordered, on = .(specie)]
# specie condition value
# 1: triticum normal 13.230663
# 2: triticum stress 30.658355
# 3: triticum Nitrogen 9.402721
# 4: poacee normal 14.589322
# 5: poacee stress 10.744153
# 6: poacee Nitrogen 7.299742
# 7: banana normal 9.845850
# 8: banana stress 9.416088
# 9: banana Nitrogen 4.178521
# 10: sorgho normal 12.623696
# 11: sorgho stress 11.394047
# 12: sorgho Nitrogen 0.498003data.table万岁:)
https://stackoverflow.com/questions/65135836
复制相似问题