首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有条件地填充R中的一组列?

如何有条件地填充R中的一组列?
EN

Stack Overflow用户
提问于 2022-03-25 15:11:32
回答 1查看 28关注 0票数 0

我有这样的数据:

代码语言:javascript
复制
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来形成列。我就是这样做的:

代码语言:javascript
复制
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,依此类推。最后的结果(前四列)如下所示:

代码语言:javascript
复制
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)

这对我来说是一个相当复杂的逻辑,我不知道如何处理这个任务。

EN

回答 1

Stack Overflow用户

发布于 2022-03-25 15:14:56

我们可以按'date','ID1','ID2',循环across列从'A_a_xy‘到'C_d_cc',如果full_id值等于’值‘的'cur_column(), get the和’,并减去列名与'ID3‘匹配的’值‘。

代码语言:javascript
复制
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

代码语言:javascript
复制
# 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    100
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71619211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档