计算以前的R经验[已关闭]

2wnc66cl  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(92)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
4天前关闭。
Improve this question
我有一个类似于(df)的数据框,有数百万行。它包含了与不同个人向不同国家销售相关的信息。
注意:每一行都有一个不同的id-prod-d-year:

df <- structure(list(id = c("A", "A", "A", "A", "A", "A", "A", "B", "B", "B"), 
               year = c(2000, 2000, 2001, 2001, 2002, 2003, 2007, 2004, 2005, 2004), 
               prod = c("X", "Y", "X", "Y", "X", "X", "M", "Z", "Z", "M"), 
               d = c("PER", "USA", "USA", "USA", "USA", "USA", "USA", "ECU", "ECU", "SPA"), 
               value = c(1, 2, 3, 4, 5, 6, 7, 8 , 9, 10)), 
          class = "data.frame", 
          row.names = c(NA,  -10L))

我需要按目的地(d)创建变量,以收集公司在过去几年中在该目的地与其他目的地相比的百分比的相关信息。因此,新数据看起来像df_new

df_new <- data.frame(df, 
                     exper_lag_ECU=c(0, 0, 0, 0, 0, 0, 0, 0, 0.44, 0),
                     exper_lag_PER=c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                     exper_lag_SPA=c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                     exper_lag_USA=c(0, 0, 0.66, 0.66, 0.9, 0.93, 0.95, 0, 0, 0)
                     )

例如,如果公司A在2002年向美国销售,我想知道该公司之前向美国销售的百分比是多少(与投资组合中的其他目的地相比),例如2000=2+2001=3+2001=4(总价值为1+2+3+4)。因此,在2002年,我将在新变量“exper_lag_USA”中为公司A分配经验(9/10 = 0.9)。同样的直觉适用于其他变量和观察。
我需要一个集成的解决方案,既不使用循环,也不使用数据的分割(合并),也不使用不同目的地(d)的手动插补,因为我的数据集中有数百个。
有线索吗?

7gcisfzg

7gcisfzg1#

你可以用tidyverse这样做。

library(tidyverse)
df_new <- df %>% 
  left_join({.} %>% #create a dataframe from df to join to the original
              group_by(id, year, d) %>% 
              summarise(value = sum(value)) %>% #consolidate by product
              group_by(id) %>% 
              mutate(cumval = cumsum(lag(value, default = 0))) %>% #total sales
              group_by(id, d) %>% 
              mutate(exper = cumsum(lag(value, default = 0)) / cumval, #total by d
                     exper = ifelse(is.nan(exper), 0, exper)) %>%   #correct 0/0 
              ungroup() %>% 
              select(id, year, d, exper) %>% 
              pivot_wider(names_from = d, names_prefix = "exper_", 
                          values_from = exper, values_fill = 0))

df_new
   id year prod   d value exper_PER exper_USA exper_ECU exper_SPA
1   A 2000    X PER     1         0 0.0000000 0.0000000         0
2   A 2000    Y USA     2         0 0.0000000 0.0000000         0
3   A 2001    X USA     3         0 0.6666667 0.0000000         0
4   A 2001    Y USA     4         0 0.6666667 0.0000000         0
5   A 2002    X USA     5         0 0.9000000 0.0000000         0
6   A 2003    X USA     6         0 0.9333333 0.0000000         0
7   A 2007    M USA     7         0 0.9523810 0.0000000         0
8   B 2004    Z ECU     8         0 0.0000000 0.0000000         0
9   B 2005    Z ECU     9         0 0.0000000 0.4444444         0
10  B 2004    M SPA    10         0 0.0000000 0.0000000         0

相关问题