[英]Change values from categorical to nominal in R
我想按等級更改分類列中的所有值。 可以使用列中已排序的唯一元素的索引來確定排名。
例如,
> data[1:5,1]
[1] "B2" "C4" "C5" "C1" "B5"
然后我希望這些列中的條目替換分類值
> data[1:5,1]
[1] "1" "4" "5" "3" "2"
另一欄:
> data[1:5,3]
[1] "Verified" "Source Verified" "Not Verified" "Source Verified" "Source Verified"
然后是更新的列:
> data[1:5,3]
[1] "3" "2" "1" "2" "2"
我將此代碼用於此任務,但要花費很多時間。
for(i in 1:ncol(data)){
if(is.character(data[,i])){
temp <- sort(unique(data[,i]))
for(j in 1:nrow(data)){
for(k in 1:length(temp)){
if(data[j,i] == temp[k]){
data[j,i] <- k}
}
}
}
}
如果可能的話,請向我建議有效的方法。 謝謝。
這是base
R中的解決方案。我創建了一個輔助函數,該函數使用其唯一的排序值作為級別將每列轉換為一個因子。 除了我使用as.integer
獲取排名值外,這與您所做的類似。
rank_fac <- function(col1)
as.integer(factor(col1,levels = unique(col1)))
一些數據示例:
dx <- data.frame(
col1= c("B2" ,"C4" ,"C5", "C1", "B5"),
col2=c("Verified" , "Source Verified", "Not Verified" , "Source Verified", "Source Verified")
)
在不使用for循環的情況下應用它。 最好在這里使用lapply
以避免副作用。
data.frame(lapply(dx,rank_fac)
結果:
# col1 col2
# [1,] 1 3
# [2,] 4 2
# [3,] 5 1
# [4,] 3 2
# [5,] 2 2
library(data.table)
setDT(dx)[,lapply(.SD,rank_fac)]
# col1 col2
# 1: 1 3
# 2: 4 2
# 3: 5 1
# 4: 3 2
# 5: 2 2
僅使用as.integer
:
setDT(dx)[,lapply(.SD,as.integer)]
使用match
:
# df is your data.frame
df[] <- lapply(df, function(x) match(x, sort(unique(x))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.