【发布时间】:2022-11-26 23:37:25
【问题描述】:
我有一个像这样的数据集:
year = c("2000", "2000", "2000", "2002", "2000", "2002", "2007")
id = c("X", "X", "X", "X", "Z", "Z", "Z")
product = c("apple", "orange", "orange", "orange", "cake", "cake", "bacon")
market = c("CHN", "USA", "USA", "USA", "SPA", "CHL", "CHL")
df = data.frame(year, id, product, market)
我想创建 3 个变量,指示:
- FPFM = 如果在给定市场上第一次使用该产品,则取值 1
- FP = 如果是第一次使用此产品,则取值 1
- FM = 如果是第一次进入该市场,则取值 1:
因此,新数据将如下所示:
year = c("2000", "2000", "2000", "2002", "2000", "2002", "2007") id = c("X", "X", "X", "X", "Z", "Z", "Z") product = c("apple", "orange", "orange", "orange", "cake", "cake", "bacon") market = c("CHN", "USA", "USA", "USA", "SPA", "CHL", "CHL") FPFM = c(1, 1, 1, 0, 1, 1, 1) FP = c(1, 1, 1, 0, 1, 0, 1) FM = c(1, 1, 1, 0, 1, 1, 0) df_desired = data.frame(year, id, product, market, FPFM, FP, FM)我尝试了以下df_new没有成功的代码:
df_new <- df %>% arrange(id, year) %>% group_by(id, product, market) %>% mutate(FPFM = row_number(year) == 1) %>% as.data.frame() %>% group_by(id, product) %>% mutate(FP = row_number(year) == 1) %>% as.data.frame() %>% group_by(id, market) %>% mutate(FM = row_number(year) == 1) %>% as.data.frame()它只为真正的第一次观察提供价值。我想获得第一年观察到的产品、市场或两者组合的价值。
第 3 行应该是“TRUE;TRUE;TRUE”而不是“FALSE;FASLE;FALSE”,因为它属于同一年。
我想到的另一个解决方案是将df按唯一值汇总3次,然后与原始df右连接。但是,这将占用大量时间和空间,因为我有大量数据。
您有最高效的集成解决方案吗?
【问题讨论】: