【问题标题】:How do I use approx() inside mutate_at() with a conditional statement in dplyr?如何在 mutate_at() 中使用 approx() 和 dplyr 中的条件语句?
【发布时间】:2018-03-22 10:35:56
【问题描述】:

我想使用 dplyr、管道和 approx() 插入缺失值。

数据:

test <- structure(list(site = structure(c(3L, 3L, 3L, 3L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L), .Label = c("lake", "stream", "wetland"), class = "factor"), 
    depth = c(0L, -3L, -4L, -8L, 0L, -1L, -3L, -5L, 0L, -2L, 
    -4L, -6L), var1 = c(1L, NA, 3L, 4L, 1L, 2L, NA, 4L, 1L, NA, 
    NA, 4L), var2 = c(1L, NA, 3L, 4L, NA, NA, NA, NA, NA, 2L, 
    NA, NA)), .Names = c("site", "depth", "var1", "var2"), class = "data.frame", row.names = c(NA, 
-12L))

此代码有效:

library(tidyverse)

# interpolate missing var1 values for each site using approx()
test_int <- test %>% 
  group_by(site) %>% 
  mutate_at(vars(c(var1)),
            funs("i" = approx(depth, ., depth, rule=1, method="linear")[["y"]]))

但如果遇到没有至少 2 个非 NA 值的分组 (site & var),则代码将不再工作,例如,

# here I'm trying to interpolate missing values for var1 & var2
test_int2 <- test %>% 
  group_by(site) %>% 
  mutate_at(vars(c(var1, var2)),
            funs("i" = approx(depth, ., depth, rule=1, method="linear")[["y"]]))

R 适当地抛出此错误: mutate_impl(.data, dots) 中的错误: 评估错误:需要至少两个非 NA 值进行插值。

如何包含条件语句或过滤器,以便它仅尝试插入站点具有至少 2 个非 NA 值并跳过其余值或为这些值返回 NA 的情况?

【问题讨论】:

  • 运行你的代码,如果我们只使用 var2 是行不通的。我相信这与lake 网站有关。它在分组内没有任何值可以使用。这是一个数据问题,而不是 dplyr。
  • 是的,你重申了我原来的问题。这就是我要求条件语句的原因,这样代码不会在遇到至少没有 2 个非 NA 值的 site & var 组合时停止。感谢 Andrew Gustar 提供以下解决方案。
  • 我的错。我读得不够仔细。干杯

标签: r dplyr


【解决方案1】:

这将满足您的需求...

test_int2 <- test %>% 
             group_by(site) %>% 
             mutate_at(vars(c(var1, var2)),
                       funs("i"=if(sum(!is.na(.))>1) 
                                  approx(depth, ., depth, rule=1, method="linear")[["y"]] 
                                else 
                                  NA))

test_int2
# A tibble: 12 x 6
# Groups:   site [3]
      site depth  var1  var2 var1_i var2_i
    <fctr> <int> <int> <int>  <dbl>  <dbl>
 1 wetland     0     1     1    1.0    1.0
 2 wetland    -3    NA    NA    2.5    2.5
 3 wetland    -4     3     3    3.0    3.0
 4 wetland    -8     4     4    4.0    4.0
 5    lake     0     1    NA    1.0     NA
 6    lake    -1     2    NA    2.0     NA
 7    lake    -3    NA    NA    3.0     NA
 8    lake    -5     4    NA    4.0     NA
 9  stream     0     1    NA    1.0     NA
10  stream    -2    NA     2    2.0     NA
11  stream    -4    NA    NA    3.0     NA
12  stream    -6     4    NA    4.0     NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多