2017-02-26 17 views
1

我試圖tolower的是字符類型的數據框我的功能轉換,發現了這個帖子:
tolower
我建立一個函數來進行在幾個數據框架上,最後發現我的所有功能都被當成了角色!sapply和運用給人以is.character()不同的結果

mytolower <- function(p_vector){ 
    if (is.character(p_vector)) return(tolower(iconv(enc2utf8(p_vector), sub = "byte"))) 
    else return(p_vector) 
} 
for (df in c("train", "test")) as.data.frame(apply(get(df), 2, function(x) mytolower(x)), stringsAsFactors = FALSE) 

展望#2更好,我發現這第二個職位,通過使用lapply部分地解決了這個問題,但奇怪的建議,以類似的方式申請,並sapply工作
lapply rather than apply
因此,我終於籌建這個示例,基本上說明我的麻煩:

train <- data.frame(v1=1:3, v2=c("a","b","c"), v3=11:13, stringsAsFactors = FALSE) 
str(train) 
apply(train, 2, function(x) is.character(x)) #wrong 
lapply(train, function(x) is.character(x)) #right 
sapply(train, function(x) is.character(x)) #right 
sapply(train, is.character) #right 

雖然申請將考慮所有的功能爲「人物」,lapply或sapply將能夠區分數字和字符的功能。爲什麼這樣?有沒有辦法讓申請找到正確的答案? 謝謝

回答

2

在應用is.character()之前,首先將train強制爲矩陣。由於矩陣僅保存單一類型的對象,因此所有元素都將成爲字符串。

apply()幫助文件:

「如果X不是數組,但一個類的一個對象,具有一個非空調光值(如數據幀),應用嘗試它強制到如果它是二維的(例如數據幀)或通過as.array,則通過as.matrix排列。「

我建議使用dplyrmutate_if()函數。

library(dplyr) 
mutate_if(train, is.character, toupper) 

# v1 v2 v3 
# 1 1 A 11 
# 2 2 B 12 
# 3 3 C 13 
0

應用功能需要一個矩陣或陣列,因爲它的輸入,並將其力轉換數據幀你餵養它和as.matrix()轉換是轉換所有的陣列的字符數組的,因爲所有的列來是字符類型。

相關問題