我有一个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)
}
但是,我收到消息:错误:“}”中的意外'}'
我哪里出错?
我希望有人可以帮我从这里继续前进。
谢谢!
答案 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")