首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reshape ()和modify_shape()

Reshape ()和modify_shape()
EN

Stack Overflow用户
提问于 2022-08-16 04:01:52
回答 2查看 42关注 0票数 2
代码语言:javascript
复制
df <- data.frame(
code1 = c ("ZAZ","ZAZ","ZAZ","ZAZ","ZAZ","ZAZ","JOZ","JOZ","JOZ","JOZ","JOZ","JOZ","TSV","TSV"), 
code2 = c("NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","TSA","TSA"),
start = c("Date1.1","Date1.1","Date1.3","Date1.3","Date1.5","Date1.5","Date3.1","Date3.1","Date3.3","Date3.3","Date3.5","Date3.5","Date 5.1","Date 5.1"),
end = c("Date2.1","Date2.1","Date2.3","Date2.3","Date2.5","Date2.5","Date4.1","Date4.1","Date4.3","Date4.3","Date4.5","Date4.5","Date6.1","Date6.1"),
price = c(1,2,3,4,5,6,1,2,3,4,5,6,1,2))

我正在努力实现:

到目前为止,我已经做了:

代码语言:javascript
复制
df <- df %>% 
group_by(code1, code2,start,end) %>% 
slice_min(price) #%>% 
group_modify()
df <- df[order(df$price),]

图中解释得很好,但简单地说:

  • 按code1、code2、start、end和选择最小的价格对每个
  • 重新发送开始、结束、价格到不同的列(最大3开始、结束、每键价格code1、code2
  • )--我知道这可以在

内部完成,但不确定是如何实现的。

任何帮助都是非常感谢的!布赖恩

EN

回答 2

Stack Overflow用户

发布于 2022-08-16 04:09:06

下面是使用dplyrtidyr库的一种方法。

每个组( price.

  • Create、code2startend)的
  • 计算code1code2的一个索引列的最小值。这是为了将startendprice命名为start_1start_2等。
  • 使用start_1以宽格式获取数据。

代码语言:javascript
复制
library(dplyr)
library(tidyr)

df %>%
  group_by(code1, code2, start, end) %>%
  summarise(price = min(price, na.rm = TRUE)) %>%
  group_by(code1, code2) %>%
  mutate(index = row_number()) %>%
  ungroup() %>%
  pivot_wider(names_from = index, values_from = c(start, end, price),
              names_vary = "slowest")
  

#  code1 code2 start_1  end_1   price_1 start_2 end_2   price_2 start_3 end_3   price_3
#  <chr> <chr> <chr>    <chr>     <dbl> <chr>   <chr>     <dbl> <chr>   <chr>     <dbl>
#1 JOZ   NAN   Date3.1  Date4.1       1 Date3.3 Date4.3       3 Date3.5 Date4.5       5
#2 TSV   TSA   Date 5.1 Date6.1       1 NA      NA           NA NA      NA           NA
#3 ZAZ   NAN   Date1.1  Date2.1       1 Date1.3 Date2.3       3 Date1.5 Date2.5       5

注意,names_vary = "slowest"允许有有序的列(start_1end_1price_1.而不是start_1start_2 .,end_1end_2。(等等)

票数 4
EN

Stack Overflow用户

发布于 2022-08-16 09:31:46

我想你可以试试aggregate + reshape + ave (都来自R基)。

代码语言:javascript
复制
reshape(
  transform(
    aggregate(price ~ ., df, min),
    id = ave(seq_along(price), code1, code2, FUN = seq_along)
  ),
  direction = "wide",
  idvar = c("code1", "code2"),
  timevar = "id"
)

这给

代码语言:javascript
复制
  code1 code2 start.1   end.1 price.1 start.2   end.2 price.2 start.3   end.3
1   ZAZ   NAN Date1.1 Date2.1       1 Date1.3 Date2.3       3 Date1.5 Date2.5
4   JOZ   NAN Date3.1 Date4.1       1 Date3.3 Date4.3       3 Date3.5 Date4.5
7   TSV   TSA Date5.1 Date6.1       1    <NA>    <NA>      NA    <NA>    <NA>
  price.3
1       5
4       5
7      NA
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73368668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档