2017-02-20 8 views
1

私はデータフレームに適用したいクラスの文字ベクトルを持っているので、そのデータフレームの各フィールドの現在のクラスをベクトルの対応するエントリに変換します。例:クラスのベクトルをデータフレームに適用する

frame <- data.frame(A = c(2:5), B = c(3:6)) 
classes <- c("character", "factor") 

forループを使用すると、これはlapplyを使用して実行できます。例:

for(i in 1:2) { frame[i] <- lapply(frame[i], paste("as", classes[i], sep = ".")) } 

私の目的のために、forループは機能しません。私が紛失している別の解決策がありますか?

入力いただきありがとうございます。

注:これはthis postの複製である可能性があります。そして、はい、私の質問はそれに似ています。しかし、私は前にclass()アプローチを見てきました。そして、フィールドを要因に変換することを効果的に扱うようには見えません。一方、恋愛のアプローチは、それをうまく行います。しかし残念ながら、私はこの例ではforループを利用することができません

+0

データのソースは何ですか?後でデータを適用するのではなく、データを読み込むときにクラスを適用するのはなぜですか? – A5C1D2H2I1M1N2O1R2T1

+0

また、明示的な 'for'ループなしで' lapply'を使用できますか? match.fun(FUN)(frame [])と同様に、フレームには、フレーム[]、 x]])}) '? – A5C1D2H2I1M1N2O1R2T1

答えて

0

lapplyのループをforループなしで使用することに反対しない場合は、次のように試してみてください。

frame[] <- lapply(seq_along(frame), function(x) { 
    FUN <- paste("as", classes[x], sep = ".") 
    match.fun(FUN)(frame[[x]]) 
}) 

str(frame) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: chr "2" "3" "4" "5" 
# $ B: Factor w/ 4 levels "3","4","5","6": 1 2 3 4 

しかし、より良い選択肢は、まずデータを読み込んでいるときに正しいクラスを適用しようとすることです。

x <- tempfile()       # Just to pretend.... 
write.csv(frame2, x, row.names = FALSE) # ... that we are reading a csv 

frame3 <- read.csv(x, colClasses = classes) 

str(frame3) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: chr "2" "3" "4" "5" 
# $ B: Factor w/ 4 levels "3","4","5","6": 1 2 3 4 

サンプルデータ:

frame <- frame2 <- data.frame(A = c(2:5), B = c(3:6)) 
classes <- c("character", "factor") 
+0

ありがとう!このアプローチは完全に機能しました。私は、ユーザーがデータファイルを読み込んで、そのファイルの各変数に必要なクラスタイプを指定できるようにするShinyアプリケーションを構築しています。あなたのコードをisolate()関数と組み合わせることは、そのトリックを行います。 – lombax2019

関連する問題