1

私はすでに SO herehereでこれを解決しようとしました-原因は良い答えを得ましたが、これは一般的な問題であると私が信じているものの部分的な解決策にすぎないことに気付きました: 多くの場合、データは変数を持つように編成されています (最も興味深いものは明らかに) 変数ごとに 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の範囲内にあるものを見逃していると思います(願っています!)。

4

3 に答える 3

4

上記の2つの良い答えですが、これは非常に良い状況だと思いましたextract

data2 %>%
  extract(sale, c("type", "price"), "type (.+); price (.+)", convert = TRUE) 
于 2015-03-20T17:43:48.900 に答える