見出し画像

R言語:データフレームを汎用的に使いたい場合(jsonliteとか)

R言語で、 jsonlite とかでDF(データフレーム)取り出した後、
df$colname1, df$colname2, ...
なんかで取り出せるようにはなるんですが、
colname1 が foo で colname2 が bar で・・みたいなデータフレームの抽出、いちいち colname1 <- と代入したりするの面倒よね。

と言うわけで、汎用に使える関数を作ってみた。関数を作ったというより、 formals を使って、引数を柔軟にさせることにした、と言うのが正解かな。

jsonlite で吐き出されるデータ/JSONと、データフレームに由らず、ある程度汎用的に使えるはず。vars <- c("a", "b") とかにしても良い
(ただし、df$a や df$b がデータフレームdf になければ意味がない)

SQLでいうところの、

select * from df.old where foo = "bar"
なら、
dataframe.extract (df = df.old, lst = colnames(df.old), foo="bar")
ってことっす。

select id from df.old where foo="bar" は、
dataframe.extract (df = df.old, lst = colnames(df.old), foo="bar")$id


# ---- 以下

# 関数 dataframe.extract() :: df <= データフレーム、 lst <= リスト

dataframe.extract <- function(df, lst) { # データフレームから条件抽出して新たなデータフレームを吐き出す関数
query <- vector()
for (i in lst) {eval(parse(text = paste0(" if (!is.null(", i, ")) { query <- append(query, paste0('(df$",i,"==\"', ",i, ", '\")')) }")))}
return(subset(df, subset = eval(parse(text = paste(query, collapse = "&")))))
}

#df.old <- fetch.dataframe.func () # データフレームをとってきてください
vars <- colnames(df.old)  #dataframe の列の名前をc()でリスト化
eval(parse(text = paste0("formals(dataframe.extract) <- alist(df =, lst = ,", paste(paste0(vars, ' = NULL'), collapse=','), ")")))  #formals を使い、関数の引数を自在に変化させる。
df.new <- dataframe.extract(df = df.old, lst = vars, a="hoge", foo="bar") #抽出
print(df.new$colname1)  #colname1 のみを出力

よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!