2016-10-06 10 views
0

データフレームを結合して、1つのデータフレームからアイテム名、最も安い買い物地域、最高売り地域を取得しようとしています。私はこれをmergeを使って1つのステップで実行しようとしましたが、エラーが続いていました。誰か他の提案がありますか?サブフレームの最小値と最大値を結合する

GOAL

item.name id buy.price buy.region sell.price sell.region 
Isogen 37 82.02  Amarr  434.37  Jita 
Nocxium 38 395.00 Amarr  449.27  Jita 
.... 

DATA

> eve.data[150:160,] 
    buy.sell item.id region  price    date item.name 
76   s  37 Amarr 99.94956 2016-10-05 22:30:42 Isogen 
1077  b  37 Jita 83.08134 2016-10-05 23:05:27 Isogen 
1078  b  37 Amarr 82.02000 2016-10-05 22:30:42 Isogen 
77   s  38 Jita 434.37451 2016-10-05 23:05:27 Nocxium 
78   s  38 Amarr 449.24791 2016-10-05 22:30:42 Nocxium 
1079  b  38 Jita 421.00000 2016-10-05 23:05:27 Nocxium 
1080  b  38 Amarr 395.00000 2016-10-05 22:30:42 Nocxium 
79   s  39 Jita 1036.06204 2016-10-05 23:05:27 Zydrine 
80   s  39 Amarr 1389.18975 2016-10-05 22:30:42 Zydrine 
1081  b  39 Jita 1009.97722 2016-10-05 23:05:27 Zydrine 
1082  b  39 Amarr 1063.52062 2016-10-05 22:30:42 Zydrine 

MY CODE:

x<-paste0(0:500,collapse=",") 
eve.url<-paste0("http://eve-marketdata.com/api/item_prices2.txt?char_name=demo&type_ids=",x,"&region_ids=10000002,10000033&buysell=a") 
eve.data<-read.table(url(eve.url),sep="\t",col.names=c("buy.sell","item.id","region","price","date"),stringsAsFactors=F) 
eve.data$region[eve.data$region==10000002]<-"Jita" 
eve.data$region[eve.data$region==10000033]<-"Amarr" 
eve.data$item.name <- item.ids[match(eve.data$item.id, item.ids$typeID),2] 
#doesnt work 
group_by(eve.data$buy.sell)%>%mutate(low.buy.price=XXX,low.buy.region=XXX, high.sell.price=XXX,high.sell.region=XXX) 

答えて

0

私がウェブから同じデータを得ることができなかったようです。私がダウンロードしたテーブルでは多くの価格は0です。

ただし、以下のコードは、1つのステップですべての情報を得ることができます:あまりにも一緒に

x <- eve.data %>% group_by(item.id) %>% 
    summarise(
     low.buy.price = min(price[buy.sell == 'b']), 
     low.buy.region = paste(region[buy.sell == 'b' & price == low.buy.price], collapse = ','), 
     high.sell.price = max(price[buy.sell == 's']), 
     high.sell.region = paste(region[buy.sell == 's' & price == high.sell.price], collapse = ',') 
    ) 
1

私は以来tidyverse内部の単一のステップでこれを行う方法があります確信しているが、私は創造性が欠けているので、2段階の手順も働きます。

  1. 低価格のデータフレームを作成します。
  2. 高い売価を保有するデータフレームを作成します。
  3. データをまとめて結合します。

再現性の例は次のとおりです。私たちは、このようにプレビューすることができ

library(readr) 
library(dplyr) 

x <- paste0(0:500,collapse=",") 
eve.url <- paste0("http://eve-marketdata.com/api/item_prices2.txt?char_name=demo&type_ids=",x,"&region_ids=10000002,10000033&buysell=a") 

eve.data <- read_tsv(url(eve.url), col_names=c("buy.sell", "item.id", "region", "price", "date")) 
eve.data$region[eve.data$region==10000002]<-"Jita" 
eve.data$region[eve.data$region==10000033]<-"Amarr" 

eve.data %>% 
    filter(buy.sell == 'b') %>% 
    group_by(buy.sell, item.id) %>% 
    top_n(1, desc(price)) %>% 
    ungroup %>% 
    select(item.id, buy.region = region, low.buy.price = price) -> 
    buys 

eve.data %>% 
    filter(buy.sell == 's') %>% 
    group_by(buy.sell, item.id) %>% 
    top_n(1, price) %>% 
    ungroup %>% 
    select(item.id, sell.region = region, high.sell.price = price) -> 
    sells 

buys %>% 
    full_join(sells, by = c("item.id")) -> 
    eve.merged 

eve.merged %>% 
    filter(item.id %in% 37:39) 

# A tibble: 3 × 5 
    item.id buy.region low.buy.price sell.region high.sell.price 
    <int>  <chr>   <dbl>  <chr>   <dbl> 
1  37  Amarr  82.020  Amarr  99.94956 
2  38  Amarr  395.000  Amarr  449.24791 
3  39  Jita  1012.569  Amarr  1389.18975 
+0

これは動作するようですが、アイテムごとに複数の行があります – Rilcon42

+0

ああ、はい。タイが存在する場合、複数の行が返されます。あなたはあなたが好きなものを選ぶ方法がありますか?ランダムに選択するか、またはロットを除外する必要がありますか? –

+0

申し訳ありませんが、私は各商品を選択し、最も低い購入価格と最も高い販売価格 – Rilcon42

0

缶チェーンのすべて...

> dput(test) 
    structure(list(buy.sell = structure(c(2L, 1L, 1L, 2L, 2L, 1L, 
    1L, 2L, 2L, 1L, 1L), .Label = c("b", "s"), class = "factor"), 
    id = c(37L, 37L, 37L, 38L, 38L, 38L, 38L, 39L, 39L, 39L, 
    39L), region = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L), .Label = c("Amarr", "Jita"), class = "factor"), 
    item.price = c(99.94956, 83.08134, 82.02, 434.37451, 449.24791, 
    421, 395, 1036.06204, 1389.18975, 1009.97722, 1063.52062), 
    date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L), .Label = "5/10/2016", class = "factor"), time = structure(c(1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L), .Label = c("22:30:42", 
    "23:05:27"), class = "factor"), item.name = structure(c(1L, 
    1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("Isogen", 
    "Nocxium", "Zydrine"), class = "factor")), .Names = c("buy.sell", 
    "id", "region", "item.price", "date", "time", "item.name"), class ="data.frame", row.names = c(NA, 
    -11L)) 

コード

full_join(tidyr::spread(test, buy.sell, item.price) %>%  
group_by(item.name) %>% 
dplyr::filter(b==min(b, na.rm=T)) %>% 
select(item.name,buy.region = region, buy.low.price=b), 
tidyr::spread(test, buy.sell, item.price) %>% 
group_by(item.name) %>% 
dplyr::filter(s==max(s, na.rm=T)) %>% 
select(item.name, sell.region = region, sell.high.price=s)) 

出力

Joining, by = "item.name" 
Source: local data frame [3 x 5] 
Groups: item.name [?] 

    item.name buy.region buy.low.price sell.region sell.high.price 
    <fctr>  <fctr>   <dbl>  <fctr>   <dbl> 
1 Isogen  Amarr  82.020  Amarr  99.94956 
2 Nocxium  Amarr  395.000  Amarr  449.24791 
3 Zydrine  Jita  1009.977  Amarr  1389.18975 
関連する問題