データ前処理の関数化について
データ前処理を関数化しようと試みておりますが、3つほど気になるところがありエラーが出てしまうので質問させていただきます。よろしくお願い致します。
1, 関数の中に関数を入れても問題がないのでしょうか。
以下の関数でnum
がきちんと働いてくれるか気になります。
syori <- function(variables,num){
setwd("C:\\Users\\hoge\\Desktop")
names <- list.dirs("csv", full.names = F, recursive = FALSE)
files <- list.files("csv", full.names = F, pattern="csv",recursive = FALSE)
reading <- function(x){
library(dplyr)
setwd("C:\\Users\\hoge\\Desktop")
kaerichi<- fread(x) %>% select_(variables)%>%
filter(Q1 == num) %>%
mutate(cnum=num)
return(kaerichi)
}
for (i in names) {
setwd("C:\\Users\\hoge\\Desktop\\csv")
mypath <- file.path(getwd(), paste0(i,".csv"))
assign(i, reading(mypath))
}
}
all <- rbind(paste(names,collapse=",")) %>% as.data.frame()
return(all)
}
2,また、上記の関数の中のfread
に対して以下のエラーが出てしまいます。
どのように対処すべきでしょうか?
file.names
でとった"hoge.csv"
の形と
file.path(getwd(), file.names)
から.csv
を落としたもの)でとった
"C:\\Users\\hoge\\Desktop"
の形の両方共試しています。
Error in fread(x) :
'input' must be a single character string containing a file name,
a command, full path to a file,
a URL starting 'http[s]://', 'ftp[s]://' or 'file://', or the input data itself
3, file.names
で取得したファイル名をassign
でデータフレーム名にし、rbind
で一気にタテに結合したいのですが
rbind(file.names(hogehoge))
でいけるものでしょうか?
file.names
だとchr
の型になっているのでカンマ区切りにする必要があるでしょうか?
http://qiita.com/uri/items/e162302ce8a38b009660 を参照しました。
3の解答
3が自己解決?したので追記しておきます。
paste0(file.names,collapse=",")
で全部つながりました。
追記
child2 <- syori(quote(c(ID,hensuu,...,Q122)),2)
を実行すると、quote
の中身が返ってきて困っています。
本来ならディレクトリの中のcsvをうまく処理したものが帰ってくるはずなのですが。
追記2
all <- rbind(paste(names,collapse=","))
が原因のようです。rbindの中を手書きにするとうまくいくのですが。
paste0にしても変わらないです。型はcharacterです。
→crayfish44さんの投稿を参考に
rbind(eval(parse(text=paste0(names,collapse=","))))
と書き換えましたが
Error in parse(text = paste0(names, collapse = ",")) :
<text>:1:4: unexpected ','
というエラーが出ます。