【问题标题】:Arrange a dataset based on a column , then return rows indices根据列排列数据集,然后返回行索引
【发布时间】:2021-03-16 11:59:08
【问题描述】:

下午好!

假设我们有以下数据集:

Centers = structure(list(X5 = c(5, 2, 6, 5, 6, 5, 1, 1, 1, 3, 1, 1, 5), 
    X1 = c(4, 1, 1, 6, 10, 10, 1, 1, 1, 10, 1, 1, 1), X1.1 = c(4, 
    1, 1, 5, 2, 6, 1, 1, 1, 3, 1, 1, 1), X1.2 = c(5, 1, 1, 6, 
    8, 1, 1, 1, 2, 10, 3, 1, 6), X2 = c(7, 2, 2, 10, 10, 10, 
    4, 10, 1, 6, 1, 3, 3), X1.3 = c(10, 1, 1, 1, 2, 4, 3, 1, 
    3, 10, 3, 1, 1), X3 = c(3, 1, 3, 3, 7, 4, 1, 1, 1, 5, 1, 
    1, 1), X1.4 = c(2, 1, 1, 1, 8, 10, 1, 1, 1, 1, 1, 1, 1), 
    X1.5 = c(1, 5, 1, 1, 10, 10, 1, 1, 7, 4, 1, 1, 1), X2.1 = c(2, 
    2, 2, 4, 4, 4, 2, 2, 2, 4, 2, 2, 2)), row.names = c(1L, 8L, 
19L, 41L, 69L, 83L, 116L, 127L, 158L, 347L, 470L, 505L, 569L), class = "data.frame")

centers data : 
        X5 X1 X1.1 X1.2 X2 X1.3 X3 X1.4 X1.5 X2.1
    1    5  4    4    5  7   10  3    2    1    2
    8    2  1    1    1  2    1  1    1    5    2
    19   6  1    1    1  2    1  3    1    1    2
    41   5  6    5    6 10    1  3    1    1    4
    69   6 10    2    8 10    2  7    8   10    4
    83   5 10    6    1 10    4  4   10   10    4
    116  1  1    1    1  4    3  1    1    1    2
    127  1  1    1    1 10    1  1    1    1    2
    158  1  1    1    2  1    3  1    1    7    2
    347  3 10    3   10  6   10  5    1    4    4
    470  1  1    1    3  1    3  1    1    1    2
    505  1  1    1    1  3    1  1    1    1    2
    569  5  1    1    6  3    1  1    1    1    2

我正在寻找一种方法来arrange 这个数据框based on the last column X2.1

排列数据:

df <- Centers[order(Centers[, ncol(Centers)]), ]

df 
#     X5 X1 X1.1 X1.2 X2 X1.3 X3 X1.4 X1.5 X2.1
# 1    5  4    4    5  7   10  3    2    1    2
# 8    2  1    1    1  2    1  1    1    5    2
# 19   6  1    1    1  2    1  3    1    1    2
# 116  1  1    1    1  4    3  1    1    1    2
# 127  1  1    1    1 10    1  1    1    1    2
# 158  1  1    1    2  1    3  1    1    7    2
# 470  1  1    1    3  1    3  1    1    1    2
# 505  1  1    1    1  3    1  1    1    1    2
# 569  5  1    1    6  3    1  1    1    1    2
# 41   5  6    5    6 10    1  3    1    1    4
# 69   6 10    2    8 10    2  7    8   10    4
# 83   5 10    6    1 10    4  4   10   10    4
# 347  3 10    3   10  6   10  5    1    4    4

之后,我需要检索以下list 输出:

list1=list(c(1,8,19,116,127,158,470,505,569),c(41,69,83,347))

此输出根据使用的数据集而变化。 (为了清楚起见,我想将此列表作为输出检索,我对与这些索引关联的行子集不感兴趣)

希望我的问题很清楚!

非常感谢您的帮助!

【问题讨论】:

  • 所以您想按最后一列排序整个data.frame(),然后获取您在list() 中指定的行?
  • @Base_R_Best_R,完全正确!

标签: r tidyverse


【解决方案1】:

你可以使用split:

split(rownames(df), df$X2.1)
#split(rownames(Centers), Centers$X2.1) #Alternative
#$`2`
#[1] "1"   "8"   "19"  "116" "127" "158" "470" "505" "569"
#
#$`4`
#[1] "41"  "69"  "83"  "347"

【讨论】:

    【解决方案2】:

    经过一些努力,我们可以使用这个解决方案:

    library(tidyverse)
    
    
     df <- data.frame(
      x=rnorm(25),
      y=rnorm(25),
      g=rep(factor(LETTERS[1:5]), 5)
    )
    
    print(df)
    
    X <- split(df, df$g) #split dataframe by groups
    str(X)
    
    print(X)
    print(lapply(X,rownames)) # print a list of desired rownames 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2018-07-08
      • 2018-03-30
      • 1970-01-01
      • 2014-10-12
      相关资源
      最近更新 更多