如何为列中的不同值计算缺失值

时间:2018-04-13 15:51:49

标签: r function if-statement

我有一个df:

Context <- c(HUM, HUM, DEV, HUM, DEV, HUM, DEV)
Amount <- c(100, 150, NA, NA, 500, 150, 600)

我感兴趣的是在Context = DEV和Context = HUM时输入缺失值。所以我想在Context中输入2个不同的值。

我尝试过制作“if功能”,但实际上并没有用。

首先,我在上下文中找到了HUM和DEV的平均值:

df %>%
  group_by(Context) %>%
  summarise(mean_amount = mean(Amount, na.rm = TRUE))

然后我分配了HUM和Dev的平均值

mean_hum <- 133
mean_dev <- 550

然后在Context = DEV和Context = HUM时输入一个值:

df$impute_amount <- df %>%
  if (Context == "HUM") {
  ifelse(is.na(df$Amount), mean_hum, df$Amount)
  }if (Context == "Dev"){
    ifelse(is.na(df$Amount), mean_dev, 
df$Amount)
  }

但是,我收到消息:错误:“}”中的意外'}'

我哪里出错?

我希望有人可以帮我从这里继续前进。

谢谢!

1 个答案:

答案 0 :(得分:1)

我相信下面的代码符合您的要求 首先,您提供的数据是错误的,您必须在引号之间添加"HUM""DEV"。 我从the accepted answer to this question获取了灵感和部分代码。我正在讨论的代码部分是辅助函数impute.mean

impute.mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))

df %>%
    group_by(Context) %>%
    mutate(impute_amount = impute.mean(Amount))
## A tibble: 7 x 3
## Groups:   Context [2]
#  Context Amount impute_amount
#  <fct>    <dbl>         <dbl>
#1 HUM       100.          100.
#2 HUM       150.          150.
#3 DEV        NA           550.
#4 HUM        NA           133.
#5 DEV       500.          500.
#6 HUM       150.          150.
#7 DEV       600.          600.

数据

df <-
structure(list(Context = structure(c(2L, 2L, 1L, 2L, 1L, 2L, 
1L), .Label = c("DEV", "HUM"), class = "factor"), Amount = c(100, 
150, NA, NA, 500, 150, 600)), .Names = c("Context", "Amount"), row.names = c(NA, 
-7L), class = "data.frame")