我有这样的数据:
date <- c('2020-1', '2020-1','2020-1','2020-2','2020-2','2020-2','2020-2','2020-3','2020-3','2020-3','2020-3')
ID1 <- c('A', 'A', 'B', 'A', 'A', 'A', 'A', 'C', 'A', 'C', 'C')
ID2 <- c('a', 'a', 'a', 'b', 'c', 'c', 'b', 'c', 'd', 'd', 'd')
ID3 <- c('xy', 'xz', 'ab', 'ac', 'ac', 'ac', 'zy', 'yz', 'yy', 'zz', 'cc')
value <- c(100, 10, 50, 0, 10, 100, 15, 16, 17, 100, 50)
df1 <- data.frame(date, ID1, ID2, ID3, value)我需要基于唯一的完整ID = ID1_ID2_ID3来形成列。我就是这样做的:
df2 <- df1 %>% unite(full_id, c("ID1", "ID2", "ID3"), sep = "_", remove = FALSE)
full_id.unique <- df2$full_id %>% unique()
df2[,full_id.unique]<-NA现在,我想用以下逻辑填充这些列。每个新列的每一行都应该包含"value“列的值之和,这些值来自日期、ID1和ID2与当前行相同的值而不匹配ID3的行。例如,A_a_xy列的第一个单元格将等于10,因为第二行按日期、ID1、ID2匹配第一行,在ID3中不匹配,其余为0,依此类推。最后的结果(前四列)如下所示:
A_a_xy <- c(10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
A_a_xz <- c(0,100,0,0,0,0,0,0,0,0,0)
B_a_ab <- c(0,0,0,0,0,0,0,0,0,0,0)
A_b_ac <- c(0,0,0,15,0,0,0,0,0,0,0)这对我来说是一个相当复杂的逻辑,我不知道如何处理这个任务。
发布于 2022-03-25 15:14:56
我们可以按'date','ID1','ID2',循环across列从'A_a_xy‘到'C_d_cc',如果full_id值等于’值‘的'cur_column(), get the和’,并减去列名与'ID3‘匹配的’值‘。
library(dplyr)
df2 %>%
group_by(date, ID1, ID2) %>%
mutate(across(A_a_xy:C_d_cc,
~ case_when(full_id == cur_column()
~sum(value, na.rm = TRUE) -
sum(value[trimws(cur_column(), whitespace = ".*_") == ID3]), TRUE ~ 0))) %>%
ungroup-output
# A tibble: 11 × 16
date full_id ID1 ID2 ID3 value A_a_xy A_a_xz B_a_ab A_b_ac A_c_ac A_b_zy C_c_yz A_d_yy C_d_zz C_d_cc
<chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2020-1 A_a_xy A a xy 100 10 0 0 0 0 0 0 0 0 0
2 2020-1 A_a_xz A a xz 10 0 100 0 0 0 0 0 0 0 0
3 2020-1 B_a_ab B a ab 50 0 0 0 0 0 0 0 0 0 0
4 2020-2 A_b_ac A b ac 0 0 0 0 15 0 0 0 0 0 0
5 2020-2 A_c_ac A c ac 10 0 0 0 0 0 0 0 0 0 0
6 2020-2 A_c_ac A c ac 100 0 0 0 0 0 0 0 0 0 0
7 2020-2 A_b_zy A b zy 15 0 0 0 0 0 0 0 0 0 0
8 2020-3 C_c_yz C c yz 16 0 0 0 0 0 0 0 0 0 0
9 2020-3 A_d_yy A d yy 17 0 0 0 0 0 0 0 0 0 0
10 2020-3 C_d_zz C d zz 100 0 0 0 0 0 0 0 0 50 0
11 2020-3 C_d_cc C d cc 50 0 0 0 0 0 0 0 0 0 100https://stackoverflow.com/questions/71619211
复制相似问题