R:找到列总和最大的列

时间:2013-12-19 10:51:25

标签: r sorting csv

我想找到列总和最大的列。我想的是:

threeLargest = colnames(sort(colSums(data[,2:length(data)]), 
                        decreasing = TRUE)[1:3])

但是colnames只给了NULL sort(colSums...命令。

原因是我希望能够引用列中的值并绘制它。我认为必须有一个更加面向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,因为条目是该方法的字符串。

谢谢!


编辑:

这是我采用的解决方案:

我使用了来自Joris Meysorder(),我使用了来自Ananda Mahtonames()(请参阅下面的解决方案):

colCount = colSums(data[-1])
topThreeIds = order(colCount,decreasing=TRUE)[1:3] + 1 # From Joris
topThreeCols = names(data[topIds]) # From Ananda

请注意第二行中的+ 1,因为我正在跳过第一行中的date列。通过在第二行中添加一个,我得到了我想要的列的实际id。

谢谢,伙计们!

3 个答案:

答案 0 :(得分:4)

如果您查看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")

答案 1 :(得分:4)

我不会坚持使用sort()。使用order()可以更快,更合适。您还可以使用列表索引来使代码更易于阅读。

所以

id <- order(colSums(Data[-1]),decreasing=TRUE)[1:3]
matplot(Data[id],type='l')

将是一种更快捷,更简洁的方式。

答案 2 :(得分:1)

另一种解决方案是使用sort.list而不是sort,它将按从大到小的顺序返回列(因为我们忽略第一列,所以将索引加1):< / p>

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]