私はすでに SO hereとhereでこれを解決しようとしました-原因は良い答えを得ましたが、これは一般的な問題であると私が信じているものの部分的な解決策にすぎないことに気付きました: 多くの場合、データは変数を持つように編成されています (最も興味深いものは明らかに) 変数ごとに 1 つの列として、次にいくつかの変数と値のペアがまとめられた最後の列として。最後の列の変数を個別の列にスイングする一般的な方法に苦労してきましたが、このデータの整理は仕事ではないtidyr
でしょうか?
require(dplyr)
require(stringr)
data <-
data.frame(
shoptype=c("A","B","B"),
city=c("bah", "bah", "slah"),
sale=c("type cheese; price 200", "type ham; price 150","type cheese; price 100" )) %>%
tbl_df()
> data
Source: local data frame [3 x 3]
shoptype city sale
1 A bah type cheese; price 200
2 B bah type ham; price 150
3 B slah type cheese; price 100
ここでは、変数が「;」で区切られた連結列を持ついくつかの都市のいくつかのショップに関する情報があります。およびスペース付きの var-val。次のような出力が必要です。
shoptype city type price
1 A bah cheese 200
2 B bah ham 150
3 B slah cheese 100
一意の行が実行できるすべての行 (リンクされた SO の質問を参照)
require(plyr)
require(dplyr)
require(stringr)
require(tidyr)
data %>%
mutate(sale = str_split(as.character(sale), "; ")) %>%
unnest(sale) %>%
mutate(sale = str_trim(sale)) %>%
separate(sale, into = c("var", "val")) %>%
spread(var, val)
しかし、2 行目の shoptype を "A" に変更すると、これが原因でエラーが発生します。お気に入り:
data2 <-
data.frame(
shoptype=c("A","A","B"),
city=c("bah", "bah", "slah"),
sale=c("type cheese; price 200", "type ham; price 150","type cheese; price 100" )) %>%
tbl_df()
data2 %>%
mutate(sale = str_split(as.character(sale), "; ")) %>%
unnest(sale) %>%
mutate(sale = str_trim(sale)) %>%
separate(sale, into = c("var", "val")) %>%
spread(var, val)
Error: Duplicate identifiers for rows (2, 4), (1, 3)
一意のIDでこれを解決しようとしました(リンクされたSOの回答を再度参照してください):
data2 %>%
mutate(sale = str_split(as.character(sale), "; ")) %>%
unnest(sale) %>%
mutate(sale = str_trim(sale),
v0=rownames(.)) %>%
separate(sale, into = c("var", "val")) %>%
spread(var, val)
Source: local data frame [6 x 5]
shoptype city v0 price type
1 A bah 1 NA cheese
2 A bah 2 200 NA
3 A bah 3 NA ham
4 A bah 4 150 NA
5 B slah 5 NA cheese
6 B slah 6 100 NA
上記の目的の出力で説明したように、収集する方法がわからない構造的な欠落データが得られます。
私は本当にtidyrの範囲内にあるものを見逃していると思います(願っています!)。