我正在 R 中使用 Ionosphere 資料集,并嘗試撰寫一個回圈,該回圈將創建作為現有列的標準化迭代的新列并相應地命名它們。
我將“cname”作為新列名,將 c 作為原始列名。代碼是:
install.packages("mlbench")
library(mlbench)
data('Ionosphere')
library(robustHD)
col <- colnames(Ionosphere)
for (c in col[1:length(col)-1]){
cname <- paste(c,"Std")
Ionosphere$cname <- standardize(Ionosphere$c)
}
但得到以下錯誤:
"Error in `$<-.data.frame`(`*tmp*`, "cname", value = numeric(0)) :
replacement has 0 rows, data has 351
In addition: Warning message:
In mean.default(x) : argument is not numeric or logical: returning NA"
我覺得我錯過了一些非常簡單的東西,但我就是看不到它。
感激地收到任何幫助。
uj5u.com熱心網友回復:
我們可以使用lapply定制的標準化函式 setNames 和 cbind。我無權訪問您的資料集,因此我使用 iris 資料集作為示例:
df<-iris
cbind(df, set_names(lapply(df[1:4],
\(x) (x - mean(x))/sd(x)),
paste0(names(df[1:4]), '_Std')))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_Std Sepal.Width_Std Petal.Length_Std Petal.Width_Std
1 5.1 3.5 1.4 0.2 setosa -0.89767388 1.01560199 -1.33575163 -1.3110521482
2 4.9 3.0 1.4 0.2 setosa -1.13920048 -0.13153881 -1.33575163 -1.3110521482
3 4.7 3.2 1.3 0.2 setosa -1.38072709 0.32731751 -1.39239929 -1.3110521482
4 4.6 3.1 1.5 0.2 setosa -1.50149039 0.09788935 -1.27910398 -1.3110521482
5 5.0 3.6 1.4 0.2 setosa -1.01843718 1.24503015 -1.33575163 -1.3110521482
...
我覺得使用 dplyr 可以更輕松地進行這些轉換:
library(dplyr)
iris %>% mutate(across(where(is.numeric),
~ (.x - mean(.x))/sd(.x),
.names = "{col}_Std"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/377220.html
上一篇:我有R代碼來從一個檔案中提取資訊。如何為檔案夾中的所有檔案回圈播放?
下一篇:回圈變數定義R
