首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R-如何重新排列数据框中的行,同时保持它们的分组?

R-如何重新排列数据框中的行,同时保持它们的分组?
EN

Stack Overflow用户
提问于 2020-12-04 07:39:07
回答 3查看 84关注 0票数 6

我有下面的数据框架。这些行目前是以物种组的形式排序的,即高粱组,紧随其后的是豆科组。

代码语言:javascript
复制
# 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

我如何重新排列这些分组,使它们按氮值递减的顺序排列?我希望重新组织数据框,使其类似于以下内容:

代码语言:javascript
复制
     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
EN

回答 3

Stack Overflow用户

发布于 2020-12-04 07:43:59

我们可以按降序排列‘filter’行,‘arrange’值,提取‘levels’并将其用作‘排列’列的值

代码语言:javascript
复制
library(dplyr)
lvls <- data %>% 
      filter(condition == 'Nitrogen') %>% 
      arrange(desc(value)) %>% 
      pull(specie) 
data %>% 
        arrange(factor(specie, levels = lvls))%>%
        as_tibble

-output

代码语言:javascript
复制
# 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

或者在单个管道中执行此操作

代码语言:javascript
复制
data %>%
    arrange(factor(specie, levels = 
          unique(specie)[order(-value[condition == 'Nitrogen'])]))

或者使用base R

代码语言:javascript
复制
data[order(with(data, factor(specie, levels = 
     unique(specie)[order(-value[condition == "Nitrogen"])]))),]

数据

代码语言:javascript
复制
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"))
票数 5
EN

Stack Overflow用户

发布于 2020-12-04 08:23:52

另一个基础R选项(不如@akrun的基础R解决方案优雅)

代码语言:javascript
复制
with(
  data,
  do.call(
    rbind,
    split(data, factor(specie, levels = unique(specie)))[order(-value[condition == "Nitrogen"])]
  )
)

这给了我们

代码语言:javascript
复制
              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
票数 1
EN

Stack Overflow用户

发布于 2020-12-04 10:29:12

这可以使用data.table很容易地完成。我们首先以所需的顺序获取specie的单列data.table。然后,以data.table方式进行合并将会给出所需的输出。对于dt.ordered中的每个specie值,将返回来自data的匹配行。因此,specie列在最终输出中的顺序由dt.ordered中的顺序决定。

代码语言:javascript
复制
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.498003

data.table万岁:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65135836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档