2017-02-26 10 views
1

私は文字型である私のデータフレームの機能tolowerを変換しようと、このポストが判明した:
tolower
私がそうする機能を構築します最終的に私のすべての機能が文字として扱われることを発見しました! StackOverflowの上で、より良い探し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) 

、私は部分的に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は、配列が、(例えば、データフレームのような)非ヌルDIM値を持つクラスのオブジェクトでない場合、ANにそれを強制しようとする試みを適用します配列が2次元(例えば、データフレーム)であるか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()変換文字列に、アレイの全てを変換するデータフレームに変換します文字の種類になります。