###################################################函數
如何把 data.frame 中的某一列,賦值、即分組分類,,spa
解決方案:blog
先 複製 要賦值的這一列,ci
iris1<- iris; range(iris1$Sepal.Length) #[1] 4.3 7.9 獲得數據範圍,爲下面分段io
方法一: 常規賦值,,可適用於被賦值列爲 numeric、character 都可。爲 numeric 時可用< > >= <= 等,character 時可用 == 方式。ast
iris1$Sepal.Length_fuzhi1 <- iris1$Sepal.Length; str(iris1) iris1$Sepal.Length_fuzhi1[iris1$Sepal.Length < 5] <- 1 #條件用 iris1$Sepal.Length 列,而不用新複製的列,是爲了防止犯錯 iris1$Sepal.Length_fuzhi1[iris1$Sepal.Length >= 5 & iris1$Sepal.Length < 6] <- 2 iris1$Sepal.Length_fuzhi1[iris1$Sepal.Length >= 6 & iris1$Sepal.Length < 7] <- 3 iris1$Sepal.Length_fuzhi1[iris1$Sepal.Length >= 7] <- 4; str(iris1)
方法二: 自定義函數去賦值,,用於被賦值列能夠比較大小,如 numeric 型,function
iris1<- iris
num_assign <- function(temp_df,col_name,clas,newname){ ##此函數爲通用函數。。對能夠比大小的列進行賦值的函數。 # temp_data 即要處理的數據框的名字,col_name爲數據框中要處理的列名。 # clas爲分組界限組成的向量。。newname爲賦值後的新產生的列的列名。、。。。 temp_df[["temp1"]] = temp_df[["temp"]] <- temp_df[[col_name]]; CI <- rep("a",length(clas)+1); #CI 用來顯示 原來值與新賦的值 之間對應關係。 for(i in 1:length(clas)) { if(i == 1){ #獲得第一個區間 temp_df[["temp"]][temp_df[["temp1"]] < clas[i]] <- i CI[i] <- paste("<",clas[i]) }else if(i>1 & i<length(clas)){ ###獲得 第 2 到第 n-1 個區間 temp_df[["temp"]][temp_df[["temp1"]] >= clas[i-1] & temp_df[["temp1"]] < clas[i]] <- i CI[i] <- paste0(clas[i-1],"<=","x","<",clas[i]) }else{ #獲得第n個和n+1個區間 temp_df[["temp"]][temp_df[["temp1"]] >= clas[i-1] & temp_df[["temp1"]] < clas[i]] <- i CI[i] <- paste0(clas[i-1],"<=","x","<",clas[i]) temp_df[["temp"]][temp_df[["temp1"]] >= clas[i]] <- i+1 CI[i+1] <- paste0(">=",clas[i]) } } temp_df <- subset(temp_df,select = -temp1) #刪除臨時列temp1 names(temp_df)[names(temp_df)=="temp"] = newname #將新的列名賦給臨時列名。 assign_explain <- data.frame(num = 1:(length(clas)+1),CI = CI); assign_explain result <- list(temp_df=temp_df,assign_explain=assign_explain) return(result) } #應用上面函數: iris1 <- num_assign(iris1,"Sepal.Length",c(5,6,7),"fuzhii_")[[1]] assign_explain_age <- num_assign(iris1,"Sepal.Length",c(5,6,7),"fuzhii_")[[2]]; assign_explain_age
方法二: 自定義函數去賦值,,用於被賦值列不能比較大小,如 character 型,class
chr_assign <- function(temp_df,col_name,newname){ ##此函數爲通用函數。。對不用比大小的列進行賦值的函數。 # temp_data 即要處理的數據框的名字,col_name爲數據框中要處理的列名。 # 。newname爲賦值後的新產生的列的列名。、。。。 temp_df[["temp1"]] = temp_df[["temp"]] <- as.character(temp_df[[col_name]]) clas <- as.character(unique(temp_df[["temp1"]])) CI <- rep("a",length(clas)) #用來生成原值 和 所賦值的對應關係 for(i in 1:length(clas)) { temp_df[["temp"]][temp_df[["temp1"]] == clas[i]] <- i CI[i] <- clas[i] } temp_df <- subset(temp_df,select = -temp1) #刪除臨時列temp1 names(temp_df)[names(temp_df)=="temp"] = newname #將新的列名賦給臨時列名。 assign_explain <- data.frame(num = 1:(length(clas)),CI = CI) #生成賦值與相應區間的對應關係變量 result <- list(temp_df=temp_df,assign_explain=assign_explain) return(result) }
#應用上面函數:
iris1 <- chr_assign(iris1,"Species","leibie")[[1]]; str(iris1) assign_explain_age <- chr_assign(iris1,"Species","leibie")[[2]]; assign_explain_age
討論擴展:同上的思路,能夠擴展用於分類變量,不限於比較大小的 numeric 型。另外亦可將iris1 做爲中間數據框,用 iris1 <- new_data.frame .效率
擴展1:變量
篩選條件 iris1$Sepal.Length < 5 返回一個邏輯向量,長度爲 iris1 的長度150,這在未來賦值的時候 iris1$Sepal.Length_fuzhi1[iris1$Sepal.Length < 5] <- 1 ,會不會計算 150 次,是TRUE了,賦值,,是 FALSE 了,不賦值。
改換條件方式爲:which(iris1$Sepal.Length < 5) 返回一個位置向量,長度爲知足篩選條件的行數22,這在未來賦值時候,會不會更有效率。。??。。
擴展2:擴展版方法二:一個例子。。可 用於 numeric character 型。。
#將能夠比較大小的列,分組、賦值
if(num_or_char == "num"){ temp_df <- iris1 temp_df$temp1 = temp_df$temp <- temp_df$Sepal.Length clas <- c(5,6,7); clas ### seq(from=, to=, by=) CI <- rep("a",length(clas)+1); #用來生成賦值後的區間 和 所賦值的對應關係 for(i in 1:length(clas)) { if(i == 1){ #獲得第一個區間 temp_df$temp[temp_df$temp1 < clas[i]] <- i ### 即知足 <5 CI[i] <- paste("<",clas[i]) }else if(i>1 & i<length(clas)){ ###獲得 第 2 到第 n-1 個區間 temp_df$temp[temp_df$temp1 >= clas[i-1] & temp_df$temp1 < clas[i]] <- i ### 即知足 5 =< x < 6 CI[i] <- paste0(clas[i-1],"<=","x","<",clas[i]) }else{ #獲得第n個和n+1個區間 temp_df$temp[temp_df$temp1 >= clas[i-1] & temp_df$temp1 < clas[i]] <- i ### 即知足 6 =< x < 7 CI[i] <- paste0(clas[i-1],"<=","x","<",clas[i]) temp_df$temp[temp_df$temp1 >= clas[i]] <- i+1 ### 即知足 x >= 7 CI[i+1] <- paste0(">",clas[i]) } } temp_df <- subset(temp_df,select = -temp1) #刪除臨時列temp1 names(temp_df)[names(temp_df)=="temp"] = "newname" assign_explain <- data.frame(num = 1:(length(clas)+1),CI = CI); assign_explain #生成賦值與相應區間的對應關係變量 }
#將不可以比較大小的列,分組、賦值
if(num_or_char == "char"){ temp_df <- iris1 temp_df$temp1 = temp_df$temp <- as.character(temp_df$Species) clas <- as.character(unique(temp_df$temp));clas CI <- rep("a",length(clas)); #用來生成原值 和 所賦值的對應關係 for(i in 1:length(clas)) { temp_df$temp[temp_df$temp1 == clas[i]] <- i CI[i] <- clas[i] } temp_df <- subset(temp_df,select = -temp1) #刪除臨時列temp1 names(temp_df)[names(temp_df)=="temp"] = "newname" #將臨時列 temp 重命名爲設置的列名 assign_explain <- data.frame(num = 1:length(clas),CI = CI); assign_explain #生成賦值與相應區間的對應關係變量 }
#實現按照兩列分別分組,且組合後的各類狀況分組、賦值
temp_df <- iris1 temp_df$temp1 = temp_df$temp <- temp_df$Sepal.Length clas <- c(5,6,7); clas ### seq(from=, to=, by=) clas2 <- as.character(unique(temp_df$Species));clas2 newname = "SL_Species_" CI <- rep("a",length(clas)*length(clas2)); num <- rep(1,length(clas)*length(clas2)); k = 1 for(i in 1:length(clas)) { for(j in 1:length(clas2)){ # num[2*(i-1)+j] <- 10*j+i if(i == 1){ #獲得第一個區間 temp_df$temp[temp_df$temp1 < clas[i] & temp_df$Species == clas2[j]] <- 10*j+i num[k] <- 10*j+i CI[k] <- paste0(clas2[j],"且 Sepal.Length","<",clas[i]) }else if(i>1 & i<length(clas)){ ###獲得 第 2 到第 n-1 個區間 temp_df$temp[temp_df$temp1 >= clas[i-1] & temp_df$temp1 < clas[i] & temp_df$Species == clas2[j]] <- 10*j+i num[k] <- 10*j+i CI[k] <- paste0(clas2[j],"且 Sepal.Length",clas[i-1],"<=","x","<",clas[i]) }else{ #獲得第n個和n+1個區間 temp_df$temp[temp_df$temp1 >= clas[i-1] & temp_df$temp1 < clas[i] & temp_df$Species == clas2[j]] <- 10*j+i num[k] <- 10*j+i CI[k] <- paste0(clas2[j],"且 Sepal.Length",clas[i-1],"<=","x","<",clas[i]) k <- k+1 temp_df$temp[temp_df$temp1 >= clas[i] & temp_df$Species == clas2[j]] <- 10*j+(i+1) num[k] <- 10*j+(i+1) CI[k] <- paste0(clas2[j],"且 Sepal.Length",">=",clas[i]) } k <- k+1 } } temp_df <- subset(temp_df,select = -temp1);str(temp_df) #刪除臨時列temp1 names(temp_df)[names(temp_df)=="temp"] = newname assign_explain <- data.frame(num=num, CI=CI); assign_explain
另請參閱:for 循環,,自定義函數,,