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]