リスト要素の名前を取得し、do()を使用して関数全体を適用し、それらを単一のデータフレームにバインドしようとしています。do()をリスト要素の名前と一緒に使用する
require(XML)
require(magrittr)
url <- "http://gd2.mlb.com/components/game/mlb/year_2016/month_05/day_21/gid_2016_05_21_milmlb_nynmlb_1/boxscore.xml"
box <- xmlParse(url)
xml_data <- xmlToList(box)
end <- length(xml_data[[2]]) - 1
x <- seq(1:end)
away_pitchers_names <- paste0("xml_data[[2]][", x, "]")
away_pitchers_names <- as.data.frame(away_pitchers_names)
names(away_pitchers_names) <- "elements"
away_pitchers_names$elements %<>% as.character()
listTodf <- function(x) {
df <- as.data.frame(x)
tdf <- as.data.frame(t(df))
row.names(tdf) <- NULL
tdf
}
test <- away_pitchers_names %>% group_by(elements) %>% do(listTodf(.$elements))
私はそれが正常に動作リスト要素にlistTodf
機能を実行します。
listTodf(xml_data[[2]][1]
id name name_display_first_last pos out bf er r h so hr bb np s w l sv bs hld s_ip s_h s_r s_er s_bb
1 605200 Davies Zach Davies P 16 22 4 4 5 5 2 2 86 51 1 3 0 0 0 36.0 41 24 23 15
s_so game_score era
1 25 45 5.75
をしかし、私は()関数で要素の名前をループしてみたときに、私は次の取得:
:Warning message: In rbind_all(out[[1]]) : Unequal factor levels: coercing to character
そして、ここでは、出力されます
> test
Source: local data frame [5 x 2]
Groups: elements [5]
elements V1
(chr) (chr)
1 xml_data[[2]][1] xml_data[[2]][1]
2 xml_data[[2]][2] xml_data[[2]][2]
3 xml_data[[2]][3] xml_data[[2]][3]
4 xml_data[[2]][4] xml_data[[2]][4]
5 xml_data[[2]][5] xml_data[[2]][5]
私はそれが何か非常に簡単だと確信していますが、私は物事がうまくいっているところを理解できません。文字列を評価するための
明確でしたかする方が簡単かつ高速です変数をグループ化し、全体をdata.frameとして結合しますか?正確にあなたが[最小再現可能な例]で何をしようとしているのかを詳しく教えてください(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – shreyasgm
各要素リストの中に同じ変数がある場合、それらは単に異なるケースを表します。だから私は、各要素を取って一緒に結合し、それらを幅広い形式で表示しようとしています(リスト要素をデータフレームに変換すると長い形式で表示されるので)。 – BillPetti
文字列を評価する場合は、 'eval(parse(..' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' listTodf'関数 'as.data.frame'は' stringsAsFactors = FALSE'を使わずに呼び出されますので、すべての文字列はデフォルトで 'factor'クラスになり、あなたのポストに警告が出ます。 – akrun