【问题标题】:Conditional sum on a non-equivalent data frame in RR中非等效数据帧的条件和
【发布时间】:2020-05-07 18:13:57
【问题描述】:

昨天我问如何根据不同data.frame 中的条件对列求和。这在小子集中取得了成功。但是,使用完整数据需要几个小时。所以我想为什么不强制加入 plyr rbind.fill 函数,然后进行条件总和。然后我意识到我不知道怎么做,所以我希望你能帮助我。这是头。

               a           b          c          d             
1        1010001 4507888.889         NA         NA               
2        1010011  843166.708         NA         NA              
3        1010021  612500.000         NA         NA               
4        1010031  740000.000         NA         NA               
5        1010041    4166.667         NA         NA               
6        1010051 3366666.667         NA         NA             

这是尾巴。

                    a   b                 c          d            
689085             NA  NA             70.62    181.1278    
689086             NA  NA            106.30   2383.3616     
689087             NA  NA            768.80 248804.5507    
689088             NA  NA            512.30 189899.9227     
689089             NA  NA            144.70 176382.4634     
689090             NA  NA            340.90 264691.8022 

我试图做的是获取b 的每个值并将其与d 的所有值进行比较,然后将满足b(just one value)>=f(all values) 条件的c 中的所有值相加。我已经尝试过了。

df<-df%>%mutate(sumc=sum(df$g[b>=df$f]))

这将我带到了一个充满 0 的专栏 sumc。用头部和尾部显示我期望的输出应该是这样的。

                    a         b        c          d               e          
1             1010001  4507888.889       NA         NA        1943.72      
2             1010011   843166.708       NA         NA        1943.72
3             1010021   612500.000       NA         NA        1943.72
4             1010031   740000.000       NA         NA        1943.72
5             1010041     4166.667       NA         NA         177.92
6             1010051  3366666.667       NA         NA        1943.72                                          
689085             NA        NA         70.62     181.1278       NA
689086             NA        NA        106.30    2383.3616       NA
689087             NA        NA        768.80  248804.5507       NA
689088             NA        NA        512.30  189899.9227       NA
689089             NA        NA        144.70  176382.4634       NA
689090             NA        NA        340.90  264691.8022       NA

另外,我尝试使用 group_by(a) 来获取 sumc 正在取值的值,但它不起作用。

感谢所有阅读本文的人! :)

【问题讨论】:

    标签: r dplyr data.table plyr


    【解决方案1】:

    这是在data.table 中使用滚动连接的选项:

    DT[order(D), csc := cumsum(C)]
    
    DT[, sumc := 
        DT[!is.na(D)][DT, on=.(D=B), roll=Inf, mult="last", csc]
    ]
    

    输出:

              A           B      C           D     csc    sumc
     1: 1010001 4507888.889     NA          NA      NA 1943.62
     2: 1010011  843166.708     NA          NA      NA 1943.62
     3: 1010021  612500.000     NA          NA      NA 1943.62
     4: 1010031  740000.000     NA          NA      NA 1943.62
     5: 1010041    4166.667     NA          NA      NA  176.92
     6: 1010051 3366666.667     NA          NA      NA 1943.62
     7:      NA          NA  70.62    181.1278   70.62      NA
     8:      NA          NA 106.30   2383.3616  176.92      NA
     9:      NA          NA 768.80 248804.5507 1602.72      NA
    10:      NA          NA 512.30 189899.9227  833.92      NA
    11:      NA          NA 144.70 176382.4634  321.62      NA
    12:      NA          NA 340.90 264691.8022 1943.62      NA
    

    数据:

    library(data.table)
    DT <- fread("A           B          C          D             
    1010001 4507888.889         NA         NA               
    1010011  843166.708         NA         NA              
    1010021  612500.000         NA         NA               
    1010031  740000.000         NA         NA               
    1010041    4166.667         NA         NA               
    1010051 3366666.667         NA         NA 
    NA  NA             70.62    181.1278    
    NA  NA            106.30   2383.3616     
    NA  NA            768.80 248804.5507    
    NA  NA            512.30 189899.9227     
    NA  NA            144.70 176382.4634     
    NA  NA            340.90 264691.8022")
    

    【讨论】:

    • 嗨!非常感谢!这绝对适用于该示例,但是当将其与完整数据一起使用时,我收到此错误消息“提供了 730969 个项目以分配给“sumc”列的 730968 个项目。如果您希望“回收”RHS,请使用 rep() 向您的代码读者明确说明这一意图。`知道我做错了什么吗?我只是复制你的代码。 @chinsoon12
    • 似乎有一个骗局,但滚动连接应该提取 1。尝试添加 mult="last",
    • 这太完美了!工作正常。只是为了学习,请您告诉我&lt;=的情况发生了什么。我尝试在on=.(D=B) 上替换它。当然没用。我的意思是B 的值不等于D 中的任何值。
    • 如果您使用&lt;=,您将执行非等连接并查找 D 小于 B 的所有行
    【解决方案2】:

    这是一个可能的解决方案,我不确定运行需要多长时间。

    更新:为 C 提供一个值,而不是为 C 提供一个总和。

    library(tidyverse)
    
    df <- readr::read_table(
    "               a           b          c          d             
    1        1010001 4507888.889         NA         NA               
    2        1010011  843166.708         NA         NA              
    3        1010021  612500.000         NA         NA               
    4        1010031  740000.000         NA         NA               
    5        1010041    4166.667         NA         NA               
    6        1010051 3366666.667         NA         NA"
    ) %>%  bind_rows(
    readr::read_table(
      "                    a   b                 c          d            
    689085             NA  NA             70.62    181.1278    
    689086             NA  NA            106.30   2383.3616     
    689087             NA  NA            768.80 248804.5507    
    689088             NA  NA            512.30 189899.9227     
    689089             NA  NA            144.70 176382.4634     
    689090             NA  NA            340.90 264691.8022"
    )
    )
    #> Warning: Missing column names filled in: 'X1' [1]
    #> Warning: Missing column names filled in: 'X1' [1]
    df
    #> # A tibble: 12 x 5
    #>        X1       a        b     c       d
    #>     <dbl>   <dbl>    <dbl> <dbl>   <dbl>
    #>  1      1 1010001 4507889.  NA       NA 
    #>  2      2 1010011  843167.  NA       NA 
    #>  3      3 1010021  612500   NA       NA 
    #>  4      4 1010031  740000   NA       NA 
    #>  5      5 1010041    4167.  NA       NA 
    #>  6      6 1010051 3366667.  NA       NA 
    #>  7 689085      NA      NA   70.6    181.
    #>  8 689086      NA      NA  106.    2383.
    #>  9 689087      NA      NA  769.  248805.
    #> 10 689088      NA      NA  512.  189900.
    #> 11 689089      NA      NA  145.  176382.
    #> 12 689090      NA      NA  341.  264692.
    
    # What Im trying to do is taking each value of b and compare it to all values
    # of d and then sum all values in c that fulfill the condition
    # b(just one value)>=f(all values)
    
    df %>% 
      mutate(b_higher = if_else(b > max(d, na.rm = TRUE), "yes", "no", "missing")) %>% 
      mutate(c_sum = if_else(b_higher == "yes", c, NULL,NULL))
    #> # A tibble: 12 x 7
    #>        X1       a        b     c       d b_higher c_sum
    #>     <dbl>   <dbl>    <dbl> <dbl>   <dbl> <chr>    <dbl>
    #>  1      1 1010001 4507889.  NA       NA  yes         NA
    #>  2      2 1010011  843167.  NA       NA  yes         NA
    #>  3      3 1010021  612500   NA       NA  yes         NA
    #>  4      4 1010031  740000   NA       NA  yes         NA
    #>  5      5 1010041    4167.  NA       NA  no          NA
    #>  6      6 1010051 3366667.  NA       NA  yes         NA
    #>  7 689085      NA      NA   70.6    181. missing     NA
    #>  8 689086      NA      NA  106.    2383. missing     NA
    #>  9 689087      NA      NA  769.  248805. missing     NA
    #> 10 689088      NA      NA  512.  189900. missing     NA
    #> 11 689089      NA      NA  145.  176382. missing     NA
    #> 12 689090      NA      NA  341.  264692. missing     NA
    
    df %>% 
      add_row(X1 = 7, a = 1010061, b = 843167, c = 10, d = 181) %>% 
      mutate(b_higher = if_else(b > max(d, na.rm = TRUE), "yes", "no", "missing")) %>% 
      mutate(c_sum = if_else(b_higher == "yes", c, NULL,NULL))
    #> # A tibble: 13 x 7
    #>        X1       a        b     c       d b_higher c_sum
    #>     <dbl>   <dbl>    <dbl> <dbl>   <dbl> <chr>    <dbl>
    #>  1      1 1010001 4507889.  NA       NA  yes         NA
    #>  2      2 1010011  843167.  NA       NA  yes         NA
    #>  3      3 1010021  612500   NA       NA  yes         NA
    #>  4      4 1010031  740000   NA       NA  yes         NA
    #>  5      5 1010041    4167.  NA       NA  no          NA
    #>  6      6 1010051 3366667.  NA       NA  yes         NA
    #>  7 689085      NA      NA   70.6    181. missing     NA
    #>  8 689086      NA      NA  106.    2383. missing     NA
    #>  9 689087      NA      NA  769.  248805. missing     NA
    #> 10 689088      NA      NA  512.  189900. missing     NA
    #> 11 689089      NA      NA  145.  176382. missing     NA
    #> 12 689090      NA      NA  341.  264692. missing     NA
    #> 13      7 1010061  843167   10      181  yes         10
    

    reprex package (v0.3.0) 于 2020-05-07 创建

    【讨论】:

    • 感谢您的回答,但这不是我需要的! :( 我需要每行的 c 总和的值。
    • 如果C没有值应该是什么值
    猜你喜欢
    • 2021-05-29
    • 2013-02-09
    • 2019-02-24
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多