我正在撰寫一個函式來分析硬碟驅動器目錄中的 .csv 檔案,使用一系列 for 和 while 回圈(我知道 for 回圈在 R 中不受歡迎,但它們非常適合我的需要)。
該函式創建許多資料幀,并在覆寫它們之前依次對每個資料幀執行操作,然后移動到目錄中的下一個檔案以重復該操作。
到目前為止不起作用的代碼部分是從正在分析的資料檔案中獲取的向量創建矩陣。代碼的簡化版本如下所示:
data1 <- seq(1, 10, 1)
data2 <- seq(1, 7, 1)
data3 <- seq(1, 5, 1)
n <- max(length(data1), length(data2), length(data3))
k <- c(1, 2, 3)
for(a in k){
if(a == 1){
length(get(paste("data", a, sep = ""))) <- n
data_matrix <- get(paste("data", a, sep = ""))
}else{
while(exists(paste("data", a, sep = ""))){
length(get(paste("data", a, sep = ""))) <- n
data_matrix <- cbind(data_matrix, get(paste("data", a, sep = "")))
}
}
}
我的資料的性質是,我的資料集中列的長度隨每個資料集合而變化,因此我采用了這篇文章中的一種技術,該技術處理使用 cbind 系結不同長度的物件而不復制其中的資料較小的物體。
我在嘗試實作此代碼時遇到的問題是我收到錯誤訊息:
長度錯誤(get(paste("data", a, sep = ""))) <- n :賦值目標擴展為非語言物件
我猜問題是函式 get() 不能用于選擇全域環境中的專案并以這種方式修改它們。
uj5u.com熱心網友回復:
你可以使用:
get("x")[1:n]
得到一個叫做"x"padded with NAto length的向量n。
那是:
> x=1:3
> n=10
> get("x")[1:n]
[1] 1 2 3 NA NA NA NA NA NA NA
話雖如此,這是獲得您想要的矩陣的更簡潔的方法(希望您可以適應您的場景):
> datalist <- list(data1, data2, data3)
> maxlength <- max(lengths(datalist))
> sapply(datalist, function(x) x[1:maxlength] )
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 2
[3,] 3 3 3
[4,] 4 4 4
[5,] 5 5 5
[6,] 6 6 NA
[7,] 7 7 NA
[8,] 8 NA NA
[9,] 9 NA NA
[10,] 10 NA NA
uj5u.com熱心網友回復:
對于那些想要查看@GeorgeSavva 提出的解決方案如何使用我正在使用的回圈方法(我的回圈包含其他錯誤)的人:
data1 <- seq(1, 10, 1)
data2 <- seq(1, 7, 1)
data3 <- seq(1, 5, 1)
n <- max(length(data1), length(data2), length(data3))
k <- c(1, 2, 3)
for(a in k){
if(a == 1){
data_matrix <- get(paste("data", a, sep = ""))[1:n]
}else{
data_matrix <- cbind(data_matrix, get(paste("data", a, sep = ""))[1:n])
}
}
While 回圈是不必要的。我以這種方式撰寫了我的代碼,以便我可以使其盡可能通用,因為我每天都會獲得不同數量的資料集,每個資料集的大小各不相同。
我可以對每個資料集使用通用操作,因此我可以撰寫一個函式來整理資料、構建圖表并自動比較資料集,而無需為每個分析撰寫新命令。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/377723.html
