2017-02-10 6 views
0

私は、1つの列が修正されなければならないデータフレームを持っており、NAs、文字および数字を正しく処理します。データフレームは類似の名前を持ち、関心のある列は共有されます。 forループを作成して、関心のある列のすべての行を正しく変更しました。しかし、私はそれを達成するために中間オブジェクト "df"を作成しなければなりませんでした。 これは必要ですか?元のデータフレームを直接変更することができます。類似のデータフレームをループして変更を適用する

sheet1 <- read.table(text=" 
data 
    15448 
    something_else 
    15334 
    14477", header=TRUE, stringsAsFactors=FALSE) 
sheet2 <- read.table(text=" 
data 
    16448 
    NA 
    16477", header=TRUE, stringsAsFactors=FALSE) 

sheets<-ls()[grep("sheet",ls())] 

for(i in 1:length(sheets)) { 
    df<-NULL 
    df<-eval(parse(text = paste0("sheet",i))) 
    for (y in 1:length(df$data)){ 
    if(!is.na(as.integer(df$data[y]))) 
    { 
    df[["data"]][y]<-as.character(as.Date(as.integer(df$data[y]), origin = "1899-12-30")) 
    } 
    } 
    assign(eval(as.character(paste0("sheet",i))),df) 
} 
+0

NAsと文字に問題がありました。私はすべてのキャラクター情報も保持したい。多分あなたは私を見せることができます。 – Ferroao

+0

'sheets = mget(ls(pattern =" sheet [0-9] "))' –

答えて

1

as @ d.b。適用プロシージャを使用して同じ操作を実行できるだけでなく、グローバル環境内の多くのオブジェクトの管理を節約できるため、特に類似の構造の場合は、データフレームのリストを操作することを検討してください。また、ベクトル化されたifelseを使用して列を更新することも検討してください。

そして、本当に別々のデータフレームオブジェクトが必要な場合は、list2envを使用して各要素を別々のオブジェクトに変換してください。以下はas.*の機能をsuppressWarningsと置き換えたので、に戻ります。

sheetList <- mget(ls(pattern = "sheet[0-9]")) 

sheetList <- lapply(sheetList, function(df) { 
    df$data <- ifelse(is.na(suppressWarnings(as.integer(df$data))), df$data, 
         as.character(suppressWarnings(as.Date(as.integer(df$data), 
                origin = "1899-12-30")))) 
    return(df) 
}) 

list2env(sheetList, envir=.GlobalEnv) 
+0

文字列は何にする必要がありますか?データフレームの列は原子ベクトルです。異なる型を混在させることはできません。日付列または文字列のいずれかです。文字としての – Parfait

+0

は私が欲しいものすべてを表示します。 – Ferroao

+0

更新を参照してください。既存のデータ値を維持するために '' df $ data''に '' NA''を非常に簡単に変更しました。好奇心、文字列と日付の混在したフィールドでどのような分析をしたいですか? – Parfait

関連する問題