【问题标题】:Tail and Head of whole dataframe in R with column and row numberR中整个数据框的尾部和头部,列号和行号
【发布时间】:2025-12-28 16:00:10
【问题描述】:

假设我有一个有 250 行和 1000 列的 dataframe。我想找到 10 个最大值和 10 个最小值,我可以很容易地使用 tailhead 函数应用于矢量化 dataframe

但是我现在如何知道最高值在哪些列和行中?

例子:

df <- data.frame(c("house1", "house2", "house3"), c(2006, 2007, 2008), c(0.3, 0.5, 0.1), c(0.9, 0.4, 0.01))
colnames(df) <- c("house.num", "year", "data1", "data2")

> df
 house.num year data1 data2
1    house1 2006   0.3  0.90
2    house2 2007   0.5  0.40
3    house3 2008   0.1  0.01

我想知道 data1 和 data2 列的 3 个最大值以及这些值在哪一行和哪一列中的信息,所以我知道哪个房子、哪个年份和哪个数据类型最匹配。

【问题讨论】:

  • 请分享您的预期输出。

标签: r dataframe subset tail head


【解决方案1】:

使用data.table

library(data.table)
setDT(df)
# Add row number 
df[, row := .I]
columns <- c("row", paste0("data", 1:2))
df[, ..columns]
melt(df[, ..columns], id.vars = "row", variable.name = "column")[order(-value)][1:3]
   row column value
1:   1  data2   0.9
2:   2  data1   0.5
3:   2  data2   0.4

【讨论】:

    【解决方案2】:

    编辑:删除了按列分组。

    这可能不是您要寻找的格式,但这里有一个解决方案,它会以“长”格式返回结果:20 行,前 10 条记录和后 10 条记录各对应一条。每行有门牌号、年份、行号、列名,以及记录是在前10还是后10。

    df = data.frame(house.num = paste("house", 1:250, sep = ""),
                    year = sample(2000:2018, 250, replace = T))
    for(i in 1:1000) {
      df[,paste("data", i, sep = "")] = rnorm(250)
    }
    
    library(dplyr)
    library(tibble)
    library(tidyr)
    df.min.max = df %>%
      rownames_to_column("row.name") %>%
      gather(column.name, column.value, -row.name, -house.num, -year) %>%
      mutate(top.10 = rank(desc(column.value), "min") <= 10,
             bottom.10 = rank(column.value, "min") <= 10) %>%
      filter(top.10 | bottom.10)
    

    【讨论】:

      【解决方案3】:

      试试这个:

      library(data.table)
      df <- data.frame(c("house1", "house2", "house3"), c(2006, 2007, 2008), c(0.3, 0.5, 0.1), c(0.9, 0.4, 0.01))
      colnames(df) <- c("house.num", "year", "data1", data2")
      setorder(df, -data1)
      

      它将按 data1 从最大到最小对 data.frame 进行排序,然后您可以使用 head 和 tail 来获取最大/最小 10 个值。对 data2 执行相同操作

      【讨论】:

      • 谢谢!问题是,我没有 2 个数据列,而是 1000 个。我不需要最大值。每列的值,但每个数据矩阵。