【问题标题】:take unique count and sum each unique values in R取唯一计数并对 R 中的每个唯一值求和
【发布时间】:2017-11-05 05:33:33
【问题描述】:

案例1:输入

ST_DATE ND_DATE LO_NO   ACTV_CODE   ACTV_AMT    AB_NO   FEATURE_CODE    L_NU    
7/27/16 7/27/16 265       O          15          1      INTEREST        855          
7/27/16 7/27/16 265       O          14          1      INTEREST 855  

预期输出

ST_DATE ND_DATE LO_NO   ACTV_CODE   ACTV_AMT    AB_NO   FEATURE_INTEREST     L_NU   
7/27/16 7/27/16 265      O           29          1             2             855

案例 2:输入(我的代码适用于案例 2,但为案例 1 抛出错误)

ST_DATE ND_DATE LO_NO   ACTV_CODE   ACTV_AMT    AB_NO   FEATURE_CODE    L_NU    
7/27/16 7/27/16 265   O          15       1     INTEREST        855          
7/27/16 7/27/16 265   O          14       1     INSTALLMENT   855    

ST_DATE ND_DATE LO_NO   ACTV_CODE   ACTV_AMT    AB_NO   INTEREST INSTALLMENT     L_NU   
7/27/16 7/27/16 265      O           29           1      1          1           855


install_cntdup_less1 <- install_BAN %>% 
   group_by(AB_NO,LO_NO,L_NU)%>% 
   mutate(ACTV_AMT = sum(ACTV_AMT),ftr=sum(unique(!is.na(FEATURE_CODE))))%>%  
   spread(FEATURE_CODE,ftr,fill = 0)%>%
   slice(which.min(as.Date(ST_DATE, '%Y/%m/%d')))%>% 
   slice(which.max(as.Date(ND_DATE, '%Y/%m/%d'))) 

得到以下错误

Error: Duplicate identifiers for rows (29424, 29425, 29426), (7415, 7416), (30120, 30121)

尝试引入下面链接中提到的唯一 ID,但它弄乱了我的输出 Spread with duplicate identifiers (using tidyverse and %>%)

mutate(ind = row_number()) %>%

我无法理解该怎么做,任何人都可以帮助我解决错误。这似乎是重复的问题,但事实并非如此

【问题讨论】:

  • 在您的输出中,您有 8 个列名和 9 个值。 FEATURE_INTEREST 是 2 还是 1?
  • @AntoniosK 抱歉没看到是 2
  • 这似乎不是一个困难的过程,但您需要提供更多关于您的过程理念的信息。新数据集中的唯一标识符是什么?当您在 FEATURE_CODE 中有 1 个不同的值时,为什么 FEATURE_INTEREST 为 2?也许提供更多数据,以便我们可以看到不同组合的不同值?
  • @AntoniosK 如果我有 2 个不同的 feature_code 可以转换为功能怎么办。这是我之前问过的问题stackoverflow.com/questions/47115780/…

标签: r dplyr tidyverse


【解决方案1】:

这会有所帮助:

library(dplyr)
library(tidyr)

# example data
dt = read.table(text = "
                ST_DATE ND_DATE LO_NO   ACTV_CODE   ACTV_AMT    AB_NO   FEATURE_CODE    L_NU    
                7/27/16 7/27/16 265       O          15          1      INTEREST        855          
                7/27/16 7/27/16 265       OO          14          1      INTEREST        855
                7/27/16 7/27/16 265       O          15          1      OTHER        855          
                7/27/16 7/27/16 265       OO          14          1      OTHER        855 
                ", header=T, stringsAsFactors = F)

dt %>%
  group_by(AB_NO,LO_NO,L_NU)%>% 
  mutate(ACTV_AMT = sum(ACTV_AMT),
         ST_DATE = min(ST_DATE),
         ND_DATE = max(ND_DATE)) %>%
  ungroup() %>%
  mutate(id = row_number(),
         FEATURE_CODE = paste0("FEATURE_", FEATURE_CODE),
         ACTV_CODE = paste0("ACTV_", ACTV_CODE),
         count_FEATURE = 1,
         count_ACTV = 1) %>%
  spread(FEATURE_CODE, count_FEATURE) %>%
  spread(ACTV_CODE, count_ACTV) %>%
  select(-id) %>%
  group_by(ST_DATE, ND_DATE, LO_NO, ACTV_AMT, AB_NO, L_NU) %>%
  summarise_all(sum, na.rm=T) %>%
  ungroup()

# # A tibble: 1 x 10
#     ST_DATE ND_DATE LO_NO ACTV_AMT AB_NO  L_NU FEATURE_INTEREST FEATURE_OTHER ACTV_O ACTV_OO
#       <chr>   <chr> <int>    <int> <int> <int>            <dbl>         <dbl>  <dbl>   <dbl>
#   1 7/27/16 7/27/16   265       58     1   855                2             2      2       2

【讨论】:

  • 我想概括一下解决方案。可以有不同的特征码
  • 感谢您的回答我也在尝试传播 ACTV_CODE 但我收到错误您能帮我添加多个传播功能吗
  • 那么,您希望将 ACTV_CODE 与 FEATURE_CODE 完全相同,对吧?
  • 刚刚更新了我的答案,但必须添加更多行才能看到它有效。
  • 非常感谢您的耐心等待
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多