2016-05-22 16 views
1

リスト要素の名前を取得し、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] 

私はそれが何か非常に簡単だと確信していますが、私は物事がうまくいっているところを理解できません。文字列を評価するための

+0

明確でしたかする方が簡単かつ高速です変数をグループ化し、全体をdata.frameとして結合しますか?正確にあなたが[最小再現可能な例]で何をしようとしているのかを詳しく教えてください(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – shreyasgm

+0

各要素リストの中に同じ変数がある場合、それらは単に異なるケースを表します。だから私は、各要素を取って一緒に結合し、それらを幅広い形式で表示しようとしています(リスト要素をデータフレームに変換すると長い形式で表示されるので)。 – BillPetti

+0

文字列を評価する場合は、 'eval(parse(..' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' listTodf'関数 'as.data.frame'は' stringsAsFactors = FALSE'を使わずに呼び出されますので、すべての文字列はデフォルトで 'factor'クラスになり、あなたのポストに警告が出ます。 – akrun

答えて

1

eval(parse

library(dplyr) 
lapply(away_pitchers_names$elements, 
     function(x) as.data.frame.list(eval(parse(text=x))[[1]], stringsAsFactors=FALSE)) %>% 
       bind_rows() 
#  id  name name_display_first_last pos out bf er r h so hr bb np s w l 
#1 605200 Davies    Zach Davies P 16 22 4 4 5 5 2 2 86 51 1 3 
#2 430641  Boyer   Blaine Boyer P 2 4 0 0 2 0 0 0 8 7 1 0 
#3 448614 Torres, C   Carlos Torres P 3 4 0 0 0 1 0 2 21 11 0 1 
#4 592804 Thornburg   Tyler Thornburg P 3 3 0 0 0 1 0 0 14 8 2 1 
#5 518468 Blazek   Michael Blazek P 1 5 1 1 2 0 0 2 23 10 1 1 
# sv bs hld s_ip s_h s_r s_er s_bb s_so game_score era loss  note 
#1 0 0 0 36.0 41 24 23 15 25   45 5.75 <NA>  <NA> 
#2 0 1 0 21.1 22 4 4 5 7   48 1.69 <NA>  <NA> 
#3 0 0 2 22.1 22 9 9 14 21   52 3.63 <NA>  <NA> 
#4 1 2 8 18.2 13 8 8 7 29   54 3.86 <NA>  <NA> 
#5 0 1 8 21.1 23 6 6 14 18   41 2.53 true (L, 1-1) 

を使用することができますしかし、あなたが同じことにより、グループ化変数を転置ている理由だけであなたが

lapply(xml_data[[2]][1:5], function(x) 
     as.data.frame.list(x, stringsAsFactors=FALSE)) %>% 
        bind_rows() 
+1

それはまさに私のものでしたそれを間違った方法で考えていた。ありがとう! – BillPetti

関連する問題