检查多个NA列,并在R中返回另一列

检查多个NA列,并在R中返回另一列,r,if-statement,multiple-columns,multiple-conditions,R,If Statement,Multiple Columns,Multiple Conditions,我有一个数据框架,它有多个列,分别命名为“平均度量”、“工作日平均度量”、“事件平均度量”和“每月平均度量”,其中“度量”包含多个计算指标(订单、收入等)。如果它们的行有NAs,我必须检查多个列,并用另一列中的行替换它们。为此,我创建了一个函数,它对我指定的“metric”列执行相同的验证。问题是,我正在为我创建的整个新列获取相同的值,但事实并非如此 我在下面添加了一个关于结果应该是什么的示例 有没有更简单的方法?或者我在函数中缺少一些逻辑 Tks 编辑:我的函数有错误,但我确信有更好的解决方案

我有一个数据框架,它有多个列,分别命名为“平均度量”、“工作日平均度量”、“事件平均度量”和“每月平均度量”,其中“度量”包含多个计算指标(订单、收入等)。如果它们的行有NAs,我必须检查多个列,并用另一列中的行替换它们。为此,我创建了一个函数,它对我指定的“metric”列执行相同的验证。问题是,我正在为我创建的整个新列获取相同的值,但事实并非如此

我在下面添加了一个关于结果应该是什么的示例

有没有更简单的方法?或者我在函数中缺少一些逻辑

Tks

编辑:我的函数有错误,但我确信有更好的解决方案。我尝试了您的解决方案,但无法将其应用于我的数据帧。我更新了reprex,以便您能更好地帮助我

库(tidyverse)
(示例%
打印(宽度=Inf)
#>#tibble:4 x 13
#>国家品牌活动月工作日平均参观平均收入工作日平均参观
#>                                    
#>1A 11 15028 12345 1234
#>2B2NA4355
#>3cb33na-NA-NA
#>4db44na-NA-NA
#>工作日平均收入活动平均参观活动平均收入每月平均参观
#>                                                      
#> 1             12345            51271             98764               5028
#> 2             54321            59212             56435               5263
#>3 NA 98773 35634 6950
#>4 NA 8902
#>每月平均收入
#>                 
#> 1               63457
#> 2               34536
#> 3               34574
#> 4               23426
subs_度量1 A 1 1 5028 12345 1234
#>2B2NA4355
#>3cb33na-NA-NA
#>4db44na-NA-NA
#>工作日平均收入活动平均参观活动平均收入每月平均参观
#>                                                      
#> 1             12345            51271             98764               5028
#> 2             54321            59212             56435               5263
#>3 NA 98773 35634 6950
#>4 NA 8902
#>每月平均收入平均访问量平均收入新收入
#>                                      
#> 1               63457           8902           23426
#> 2               34536           8902           23426
#> 3               34574           8902           23426
#> 4               23426           8902           23426
(示例_固定百分比)
打印(宽度=Inf)
#>#tibble:4 x 15
#>国家品牌活动月工作日平均参观平均收入工作日平均参观
#>                                    
#>1A 11 15028 12345 1234
#>2B2NA4355
#>3cb33na-NA-NA
#>4db44na-NA-NA
#>工作日平均收入活动平均参观活动平均收入每月平均参观
#>                                                      
#> 1             12345            51271             98764               5028
#> 2             54321            59212             56435               5263
#>3 NA 98773 35634 6950
#>4 NA 8902
#>每月平均收入平均访问量平均收入新收入
#>                                      
#> 1               63457           5028           12345
#> 2               34536           4355           54321
#> 3               34574          98773           35634
#> 4               23426           8902           23426

由(v0.3.0)于2020-07-07创建,我们可以使用以下内容

example$avg_visits_new <- apply(example,1,function(x) x[!is.na(x)][1])


# A tibble: 4 x 5
  avg_visits wkday_avg_visits event_avg_visits monthly_avg_visits avg_visits_new
       <dbl>            <dbl>            <dbl>              <dbl>          <dbl>
1       5028             1234            51271               5028           5028
2         NA             4355            59212               5263           4355
3         NA               NA            98773               6950          98773
4         NA               NA               NA               8902           8902

有更好的方法可以做到这一点,例如,您可以将整个函数替换为:

subs_metric <- function(data, metric)
{
  data.table::fcoalesce(data[grep(metric, names(data)), ])
}
现在给出了正确的结果:

example %>% 
  mutate(avg_visits_new = subs_metric(., "visits"))
#> # A tibble: 4 x 5
#>   avg_visits wkday_avg_visits event_avg_visits monthly_avg_visits avg_visits_new
#>        <dbl>            <dbl>            <dbl>              <dbl>          <dbl>
#> 1       5028             1234            51271               5028           5028
#> 2         NA             4355            59212               5263           4355
#> 3         NA               NA            98773               6950          98773
#> 4         NA               NA               NA               8902           8902
example %>% 
  mutate(avg_visits_new = subs_metric(., "visits"))
#> # A tibble: 4 x 5
#>   avg_visits wkday_avg_visits event_avg_visits monthly_avg_visits avg_visits_new
#>        <dbl>            <dbl>            <dbl>              <dbl>          <dbl>
#> 1       5028             1234            51271               5028           5028
#> 2         NA             4355            59212               5263           4355
#> 3         NA               NA            98773               6950          98773
#> 4         NA               NA               NA               8902           8902
示例%>%
变异(平均访问量=子度量(,“访问量”))
#>#A tibble:4 x 5
#>平均参观工作日平均参观活动平均参观每月平均参观平均参观新
#>                                                        
#> 1       5028             1234            51271               5028           5028
#>2 NA 4355 59212 5263 4355
#>3 NA NA 98773 6950 98773
#>4 NA NA 8902 8902

但是,我可能会坚持使用提供的其他解决方案之一,因为它们比行循环短得多,效率也更高。

问题Daniel中给出的示例的解决方案不错,尽管我认为OP正在寻找一个可以根据
度量
后缀应用的函数,因为有很多这样的函数实际数据中的列frame@AllanCameron,你可能是对的。如果OP-see是这样,他们应该更新示例以代表实际的日期集。这是一个很好的解决方案Daniel,tks!虽然我有很多度量(更精确地说是9个不同的度量),但它们在数据帧中有点混乱(如
example %>% 
  mutate(avg_visits_new = subs_metric(., "visits"))
#> # A tibble: 4 x 5
#>   avg_visits wkday_avg_visits event_avg_visits monthly_avg_visits avg_visits_new
#>        <dbl>            <dbl>            <dbl>              <dbl>          <dbl>
#> 1       5028             1234            51271               5028           5028
#> 2         NA             4355            59212               5263           4355
#> 3         NA               NA            98773               6950          98773
#> 4         NA               NA               NA               8902           8902