R: найти столбец с наибольшей суммой столбцов
я хочу найти столбец с наибольшей суммой столбца. Я думаю о чем-то вроде:
threeLargest = colnames(sort(colSums(data[,2:length(data)]),
decreasing = TRUE)[1:3])
но colnames
дает NULL
С .
причина в том, что я хочу иметь возможность ссылаться на значения в столбце и сюжет его. Я думал, что должно быть более R-ориентированное решение, чем Петля над столбцами и подсчет самых больших.
я example_csv_file.csv
:
date,column1,column2,column3,column4
2013-12-09,0,0,0,2
2013-12-10,0,0,0,2
2013-12-11,0,0,0,2
2013-12-12,0,0,0,2
2013-12-13,0,0,0,2
2013-12-14,0,1,7,2
2013-12-15,2,15,36,2
2013-12-16,5,10,28,2
2013-12-17,1,2,39,2
2013-12-18,2,3,34,2
который я импортирую так:
data = read.csv(file = 'example_csv_file.csv', header = TRUE, sep = ",")
я могу отсортировать столбцы по их сумме столбцов и получить три верхние:
threeLargest = sort(colSums(data[,2:length(data)]), decreasing = TRUE)[1:3]
это дает:
> threeLargest
column3 column2 column4
144 31 20
но мне нужно получить имена столбцов, потому что мне нужно ссылаться на столбцы, когда я сюжет их значения. Е. Г. таким образом:
plot(data[,'column3'])
и желательно иметь список верхних, на которые я мог бы ссылаться в цикле, например это:
plot(data[,namesOfThreeLargest[1]], type = 'n')
color = 1
for (column in namesOfThreeLargest)
{
lines(data[,column], col = color)
color = color + 1
}
legend("topleft", inset=.05, lty = 1, namesOfThreeLargest, col = seq(color))
если бы я мог получить номер столбца аккуратным способом, я мог бы получить его имя таким образом:
columnWithLargestColSum = colnames(data)[4]
я попытался импортировать файл по-другому, например read.table(file =...
, read.data.frame(file =...
и as.matrix(read.csv(file =...
, чтобы увидеть, если colnames
работает, но это не так. На самом деле colSums
даже не работает для as.matrix
после записи строки для этого метода.
спасибо!
Edit:
это решение я пошел с:
я order()
С Йорис Мэйс и я names()
С Ананда Махто (см. ниже их решения):
colCount = colSums(data[-1])
topThreeIds = order(colCount,decreasing=TRUE)[1:3] + 1 # From Joris
topThreeCols = names(data[topIds]) # From Ananda
Примечание + 1
во 2-й строке, из-за того, что я пропускаю
3 ответов
если вы посмотрите str
на выходе colSums
шаг, вы увидите, что это просто именованный вектор, а не что-нибудь с "колоннами":
str(sort(colSums(data[,2:length(data)]),
decreasing = TRUE)[1:3])
# Named num [1:3] 144 31 20
# - attr(*, "names")= chr [1:3] "column3" "column2" "column4"
таким образом, если вы хотите "имена", вы должны обернуть команду в names
вместо colnames
.
другими словами:
namesOfThreeLargest <- names(threeLargest)
оттуда, теперь, когда я вижу, что вы просто хотите сделать несколько линейных графиков, вы можете посмотреть на matplot
, например:
matplot(data[, namesOfThreeLargest], type="l")
Я бы не настаивал на использовании sort()
. Используя order()
может быть быстрее и более подходящие. Вы также можете использовать индексирование списка, чтобы сделать ваш код более читаемым.
Так
id <- order(colSums(Data[-1]),decreasing=TRUE)[1:3]
matplot(Data[id],type='l')
было бы более быстрым и более сжатым способом сделать это.
альтернативным решением является использование sort.list
вместо sort
, который вернет столбцы в порядке от наибольшего к наименьшему (добавьте 1 к индексу, так как мы игнорируем первый столбец):
colnames(data)[sort.list(colSums(data[,-1]), decreasing=TRUE)[1:3] + 1]
если вы чувствуете себя особенно ленивым, вы также можете использовать rev()
чтобы изменить порядок, вместо того, чтобы печатать decreasing=TRUE
:
colnames(data)[rev(sort.list(colSums(data[,-1])))[1:3] + 1]