複数のデータフレームをループして文字列のリストを取得し、文字列を含む列を検索して、複数の新しいファイルを作成するにはどうすればよいですか?

ルーク・シンガム

24個のデータファイルがあります(bsls)。各ファイルには、固定数の行が含まれていますが、可変数の列(sitesが含まれています23のクリーンリストsitesがありますが、各サイトに関連する列名に追加情報が含まれているため、完全に一致させることはできません。

これらのファイルを読んでR、次のコード使用しました。

#list files from dir and read, skipping rows until 'Q Num'
temp <- list.files() # e.g. info-stuff-nameofbsl-otherStuff.csv

# read.xls and strip bsl name from file and assign as object name
for(i in temp){
    assign(unlist(strsplit(i, split = '-', fixed = T))[3],
           read.xls(i, pattern = "Q Num"))
}

#create list of dataframes (24 bsls)
bsls <- Filter(function(x) is(x, "data.frame"), mget(ls()))

#clean list of site names
sites <- ("NewYork","London","Sydney","Paris","Manchester","Angers","Venice","Bangkok","Glasgow","Boston","Perth","Canberra","Lyons","Washington","Milan","Cardiff","Dublin","Frankfurt","Ottawa","Toronto","El.Salvador","Taltal","Caldera")

24のbslsデータセットのうちの1つの最初の3行の例

例:BSL1

QNum,   QuestionText,   % unrelatedCol, NewYork_Other_info, London_some_other_info, Venice_other_diff_info, 
q17a,   question?,                 74%,              69%,                     81%,                  76%,
q17b,   Another question?,         72%,              73%,                     77%,                  74%,

私が必要とする結果は、23のそれぞれが24のデータファイル(内で見つかったすべての列を含むファイルをsites持つこと.csvですbsls

私の現在の試み...

for(site in sites){                             #for each site
    assign(site, data.frame())                  #create empty data frame to add vectors to
    for(bsl in dfs){                            #for each dataset
        if (grepl(site, colnames(bsl))){        #substring match
           next                                 #go back to for loop
        }
    assign(site$bsl, bsl[,grepl("site", colnames(bsl))]) #assign column to dataframe
    } 
}

解決策は次のようになります...

例:London.csv

QNum,   QuestionText, BSLname1_Other_info,  BSLname2_some_other_info, BSL5other_diff_info, 
q17a,   question?,                 74%,              69%,                     81%,                  76%,
q17b,   Another question?,         72%,              73%,                     77%,                  74%,

24個の入力bslファイルからのサイトに関連する列を含む23個のファイルが各サイトに1つずつあります。

EDIT -のそれぞれが旨の価値bslsと呼ばれていないbsl1bsl2...などが、実際にはユニークな文字列などですunitsectionteam...など

ルーク・シンガム

次のコードは私の質問を解決することになりました。最初に、のbsls前にあるデータフレームリストのすべての列の名前を変更して、元の質問をさらに細かく分類する必要がありましたfor loopこれは、誰bslsite属しているかを知るためでした名前の変更ロジックはここにあります

ループソリューション

#this loop prints the files
for (site in sites){
    #create new file with question cols only
    newfile <- data.frame(NewYork[,1:2], stringsAsFactors = F)
    # search for columns in bsls relating to site
    for (bsl in bsls){
        colids <- grepl(site, colnames(bsl))
        cols <- bsl[,colids, drop = F]
        newfile <- cbind(newfile, cols)
        }
    filename <- paste0("Site ", site," .csv")
    write.xlsx(newfile, file = filename, row.names = F)
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ