2016-06-09 22 views
3

我想編寫一個for循環,其中我需要首先將data.frame的某些列的類轉換爲字符。經過一些操作(這與這個問題無關),我需要將列轉換回原來的類。在for循環中分配不同的類

將列轉換爲其原始類必須在for循環中完成。我怎麼能這樣做?

下面是一些數據和循環示範:

# Example data 
data <- data.frame(x1 = as.numeric(1:5), x2 = as.factor(7:3)) 

for(i in 1:ncol(data)) { 

    # Save original class. 
    class_col_i <- class(data[ , i]) 

    # Convert column as character. 
    data[ , i] <- as.character(data[ , i]) 

    # (Here I will do some operations, which are irrelevant for this problem.) 

    # Here I need to convert the column back to its original class. 
    # How can I do that? 

    # data[ , i] <- class_col_i... ??? 
} 

class(data$x1) # This should be a numeric 
class(data$x2) # This should be a factor 
+0

沒有必要改變原始數據並將其更改回來。如果您需要其他功能的「字符」類,請使用副本。 –

+0

感謝您的評論。你能解釋一下你的意思是用'複製'嗎? – JSP

回答

3

使用match.fun,看下面的例子:

#dummy data 
d <- mtcars 
class(d$gear) 
# [1] "numeric" 

#change to character 
classOrg <- class(d$gear) 
d$gear <- as.character(d$gear) 
class(d$gear) 
# [1] "character" 

#do some fun stuff 
# ... d$gear 

#convert it back 
myConvertFun <- match.fun(paste0("as.", classOrg)) 
d$gear <- myConvertFun(d$gear) 
class(d$gear) 
# [1] "numeric" 
0

試試這個:

data <- data.frame(x1 = as.numeric(1:5), x2 = as.factor(7:3)) 
class_col<-NULL 
for(i in 1:ncol(data)) { 

# Save original class. 
class_col[i] <- class(data[ , i]) 

# Convert column as character. 
data[ , i] <- as.character(data[ , i]) 

# (Here I will do some operations, which are irrelevant for this  
#problem.) 

# Here I need to convert the column back to its original class. 
# How can I do that? 

class(data[ , i]) <- class_col[i] 
} 

class(data$x1) # This should be a numeric 
class(data$x2) 
+0

這適用於數字列x1。對於x2,我得到以下錯誤:類(data [,i])中的錯誤< - class_col [i]: 將類「factor」添加到無效對象 – JSP

+0

是的,我看到了。我試圖讓它現在更普遍地工作。抱歉。 –