R中整个数据帧的尾部和头部,带有列和行号

时间:2019-01-21 17:26:22

标签: r dataframe subset tail head

说我有一个dataframe,其中有250行和1000列。我想找到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个最大值,以及这些值分别在哪行和哪列的信息,因此我知道哪所房子,哪一年和哪种数据类型最匹配。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尝试一下:

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进行排序,然后您可以使用头和尾获得最大/最小10个值。对data2做同样的事情

答案 2 :(得分:0)

编辑:删除了按列分组。

这可能不是您要查找的格式,但是这是一个解决方案,它将以“长”格式返回结果:20行,每前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)