使用汇总和交叉为每个组创建一个新行? dplyr

问题描述 投票:0回答:1

我有一个数据库 ag_prod4,其结构如下:

country  item  element 1961 1962 ... 2021
usa      corn  Area    5    6    ... 8
usa      corn  Prod    8    4    ... 2
usa      corn  Yield   8    4    ... 2
usa      oil   Prod    8    4    ... 2
.
.

我想为每个国家项目组(例如:美国玉米)创建一个包含“效率”元素的新行,即每年的产品/区域。 注意:有时每个国家/地区项目组合的元素多于/少于三个,或者它们的顺序不同

这是我到目前为止所拥有的:

ag_prod4 %>% group_by(country, item) %>%
  summarize(
    element = c(unique(element),"efficiency"),
    across(starts_with("1961"):starts_with("2021"), 
           ~ ifelse(element=="efficiency",VALUE,.))
  ) %>% ungroup()

这已经差不多了,但我需要用一些东西来代替 VALUE,对于 1961 年,该值将采用美国玉米产量/美国玉米面积。

非常感谢您的帮助!这是我第一次发帖,但我很困惑

r dplyr summarize mutate across
1个回答
0
投票
library(dplyr); library(tidyr)

data.frame(
  stringsAsFactors = FALSE,
       check.names = FALSE,
           country = c("usa", "usa", "usa", "usa"),
              item = c("corn", "corn", "corn", "oil"),
           element = c("Area", "Prod", "Yield", "Prod"),
           `1961` = c(5L, 8L, 8L, 8L),
           `1962` = c(6L, 4L, 4L, 4L),
           `2021` = c(8L, 2L, 2L, 2L)
) |>
  pivot_longer(`1961`:`2021`) |>
  pivot_wider(names_from = element, values_from = value) |>
  mutate(efficiency = Prod / Area)

结果

# A tibble: 6 × 7
  country item  name   Area  Prod Yield efficiency
  <chr>   <chr> <chr> <int> <int> <int>      <dbl>
1 usa     corn  1961      5     8     8      1.6  
2 usa     corn  1962      6     4     4      0.667
3 usa     corn  2021      8     2     2      0.25 
4 usa     oil   1961     NA     8    NA     NA    
5 usa     oil   1962     NA     4    NA     NA    
6 usa     oil   2021     NA     2    NA     NA  
© www.soinside.com 2019 - 2024. All rights reserved.