【问题标题】:How to fill column with another on conditions applied on both columns如何在两列上应用的条件下用另一列填充列
【发布时间】:2017-05-27 17:22:44
【问题描述】:

我正在尝试执行一个非常简单的数据完成:我在相距几英里的两个不同位置进行了两列相同的测量。位置 1 比位置 2 更完整,我想通过将系数 (loc1/loc2) 应用于 1 来完成第二个和第一个。

我的问题是天气值会随所考虑的日期而变化,因此将相同的平均系数应用于我的所有值并不理想。我首先通过 loc1 和日期的值得到平均系数,但是对于没有 loc2 值的日子,我想:

  • 将 'coef' 值中的 NA 替换为使用相同 loc1 值计算的 coef
  • 但有时每个 loc1 值的 coef 不止一个,所以当有多个时,优先选择同一天测量的那个
  • 当一个 loc1 值根本没有 coef 值时,coef 将与该 loc1 值相同 +/- 一个间隔(最接近 loc1 值在最接近的日期的 coef 是完全的) 这是它的样子:

      loc1 Date      Coef   loc2
    1      12 204        3      4
    2      8  147        4      2
    3      8  204        NA    NA
    4      10 147        NA    NA
    5      10 158        NA    NA
    6      6  159        3      2
    7      6  162        NA    NA
    8      6  170        2      3
    9      .3 175 0.4833333 0.145
    10     0.3 204        NA    NA
    11     0.4 146        NA    NA
    12     0.4 147        NA    NA
    

我很确定有一种简单的方法可以做到这一点,但由于我对 ifelse 或 ddply 的了解有限,我最终并没有更接近我想要的。我觉得循环可以解决问题,但我不知道如何..

任何想法将不胜感激!非常感谢!

【问题讨论】:

    标签: r dataframe conditional-statements plyr completion


    【解决方案1】:

    我不明白你在第 3 条中的确切意思:

    当一个 loc1 值根本没有 coef 值时,coef 将与该 loc1 值相同 +/- 一个间隔(最接近的 loc1 值在最接近要完成的日期的 coef )

    所以我对那部分没有答案,但这可能会让你有所了解:


    library(dplyr)
    
    df <- tibble::tribble(
      ~loc1, ~Date,     ~Coef, ~loc2,
      12,  204L,         3,     4,
      8,  147L,         4,     2,
      8,  204L,        NA,    NA,
      10,  147L,        NA,    NA,
      10,  158L,        NA,    NA,
      6,  159L,         3,     2,
      6,  162L,        NA,    NA,
      6,  170L,         2,     3,
      3,  175L, 0.4833333, 0.145,
      0.3,  204L,        NA,    NA,
      0.4,  146L,        NA,    NA,
      0.4,  147L,        NA,    NA
    )
    
    df %>% 
      # Replace Coef with the coef of same loc1 and same day
      group_by(loc1, Date) %>% 
      mutate(Coef = if_else(!is.finite(Coef), mean(Coef, na.rm = TRUE), Coef)) %>% 
      # For ones without same day and loc1, use the average of all days at loc1
      group_by(loc1) %>% 
      mutate(Coef = if_else(!is.finite(Coef), mean(Coef, na.rm = TRUE), Coef)) %>% 
      ungroup() %>% 
      # Then complete the loc2 with using the completed Coef and loc1
      mutate(loc2 = if_else(!is.finite(loc2), loc1 * Coef, loc2))
    
    #> # A tibble: 12 x 4
    #>     loc1  Date      Coef   loc2
    #>    <dbl> <int>     <dbl>  <dbl>
    #>  1  12.0   204 3.0000000  4.000
    #>  2   8.0   147 4.0000000  2.000
    #>  3   8.0   204 4.0000000 32.000
    #>  4  10.0   147       NaN    NaN
    #>  5  10.0   158       NaN    NaN
    #>  6   6.0   159 3.0000000  2.000
    #>  7   6.0   162 2.5000000 15.000
    #>  8   6.0   170 2.0000000  3.000
    #>  9   3.0   175 0.4833333  0.145
    #> 10   0.3   204       NaN    NaN
    #> 11   0.4   146       NaN    NaN
    #> 12   0.4   147       NaN    NaN
    

    【讨论】:

    • 非常感谢!我的第三个项目符号的意思是用日期和 loc1 方面可能最接近的值来完成缺失的 coef。以我的示例中的第 4 行或第 5 行为例:loc1 没有相似的值,Date 没有相似的值。所以我会从第 2 行取 coef,因为 8 是 loc1 中最接近 10 的值,例如,147 比 204 更接近 147 和 158。但这会导致很多问题,比如选择您容忍 loc1 的差异的限制,或者是否有多种可能性..所以采用平均 loc1 的方法!
    • 太好了,很高兴这对您有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多