它看起來對我來說,你的主要問題是,你沒有在你的文件中讀取正確的data.frame。
我救了你的樣本數據爲ccsm.txt
在我的R會話PWD,然後運行以下:
ms <- readLines('ccsm.txt',encoding='UTF-8');
ms;
## [1] " V1 V2 V3 V4 V5 V6"
## [2] " V1 1 0.068 0.211 0.285 0.198 0.047"
## [3] " V2 0.068 1 0.851 0.450 0.277 0.014"
## [4] " V3 0.211 0.851 1 0.660 0.420 0.113"
## [5] " V4 0.285 0.450 0.660 1 0.896 0.466"
## [6] " V5 0.198 0.277 0.420 0.896 1 0.241"
## [7] " V6 0.047 0.014 0.113 0.466 0.241 1"
d <- as.data.frame(ms);
d;
## ms
## 1 V1 V2 V3 V4 V5 V6
## 2 V1 1 0.068 0.211 0.285 0.198 0.047
## 3 V2 0.068 1 0.851 0.450 0.277 0.014
## 4 V3 0.211 0.851 1 0.660 0.420 0.113
## 5 V4 0.285 0.450 0.660 1 0.896 0.466
## 6 V5 0.198 0.277 0.420 0.896 1 0.241
## 7 V6 0.047 0.014 0.113 0.466 0.241 1
names(d);
## [1] "ms"
dim(d);
## [1] 7 1
sapply(d,class);
## ms
## "factor"
正如你所看到的,你readLines()
/as.data.frame()
調用導致了7 1個data.frame其單列由來自文件的原始文本行的因素組成。
相反,你需要使用read.table()
(還有其他的選擇,以及,如fread()
從data.table):
d <- read.table('ccsm.txt');
d;
## V1 V2 V3 V4 V5 V6
## V1 1.000 0.068 0.211 0.285 0.198 0.047
## V2 0.068 1.000 0.851 0.450 0.277 0.014
## V3 0.211 0.851 1.000 0.660 0.420 0.113
## V4 0.285 0.450 0.660 1.000 0.896 0.466
## V5 0.198 0.277 0.420 0.896 1.000 0.241
## V6 0.047 0.014 0.113 0.466 0.241 1.000
names(d);
## [1] "V1" "V2" "V3" "V4" "V5" "V6"
dim(d);
## [1] 6 6
sapply(d,class);
## V1 V2 V3 V4 V5 V6
## "numeric" "numeric" "numeric" "numeric" "numeric" "numeric"
不幸的是,你的代碼仍然不能正常工作:
for (dcol in 2:length(ms)) {
temp <- d[,c(1,dcol)];
nlist <- temp[order(d[,dcol],decreasing=T)];
lname <- nlist[,1];
};
## Error in `[.data.frame`(temp, order(d[, dcol], decreasing = T)) :
## undefined columns selected
這裏有兩個問題。首先,ms
包含文件中的原始文本行,因爲包含標題行,因此編號爲7。但是文件中只有6行。因此d[,c(1,dcol)]
將在dcol
達到7時失敗。
但dcol
永遠不會達到7,因爲在第一次迭代temp[order(d[,dcol],decreasing=T)]
失敗。這是因爲temp
是data.frame,因爲它是從d
的兩列切片中分配的。但是您正在使用一個參數爲temp
建立索引,該參數爲僅包含兩個組件的基礎列表編制索引。調用order()
的返回值由整數1到6組成,因爲它在d
(並且在d
中有6行)的列上操作,所以整數3到6對於雙分量都是超出範圍列表的基礎temp
data.frame。
下面我將如何計算所需的輸出:
apply(d,1,order,decreasing=T);
## V1 V2 V3 V4 V5 V6
## [1,] 1 2 3 4 5 6
## [2,] 4 3 2 5 4 4
## [3,] 3 4 4 3 3 5
## [4,] 5 5 5 6 2 3
## [5,] 2 1 1 2 6 1
## [6,] 6 6 6 1 1 2
如果您想推薦的載體,而不是索引的名稱,你可以這樣做:
apply(d,1,function(x) names(d)[order(x,decreasing=T)]);
## V1 V2 V3 V4 V5 V6
## [1,] "V1" "V2" "V3" "V4" "V5" "V6"
## [2,] "V4" "V3" "V2" "V5" "V4" "V4"
## [3,] "V3" "V4" "V4" "V3" "V3" "V5"
## [4,] "V5" "V5" "V5" "V6" "V2" "V3"
## [5,] "V2" "V1" "V1" "V2" "V6" "V1"
## [6,] "V6" "V6" "V6" "V1" "V1" "V2"
如果你不不喜歡那第一排,因爲它一定會將「自我」向量排在最高位置,所以您可以用...[-1,]
將它索引出來。
好的。驚訝沒有人發現了9個小時 –