Хвост и заголовок целого кадра данных в R с номером столбца и строки - PullRequest
0 голосов
/ 21 января 2019

Скажите, у меня есть 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

Я хотел бы иметь 3 максимальных значения столбцов data1 и data2 и информацию, в какой строке и столбце находятся эти значения, поэтому я знаю, какой дом,какой год и какой тип данных соответствуют лучшим.

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Редактировать: Удалена группировка по столбцам.

Возможно, это не тот формат, который вы ищете, но вот решение, которое возвращает результаты в «длинном» формате: 20 строк, по одной для каждой из верхней и нижней 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)
0 голосов
/ 23 января 2019

Использование 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
0 голосов
/ 21 января 2019

Попробуйте это:

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)

Он упорядочит ваш data.frame по data1 от наибольшего к наименьшему, а затем вы можете использовать голову и хвост, чтобы получить макс / мин 10 значений. Сделайте то же самое для data2

...