说我有一个dataframe
,其中有250行和1000列。我想找到10个最大值和10个最小值,可以通过将tail
和head
函数应用于矢量化的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个最大值,以及这些值分别在哪行和哪列的信息,因此我知道哪所房子,哪一年和哪种数据类型最匹配。
答案 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)