使用summarize和across为每个组创建一个新行?dplyr

xzabzqsa  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(92)

我有一个数据库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()

这几乎是在那里,但我需要把一些东西,在1961年的价值,将采取美国玉米生产/美国玉米面积。
非常感谢您的帮助!这是我第一次发帖,但是我被卡住了

dluptydi

dluptydi1#

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

相关问题