[英]How to replace NA values in R depending on the value of another column?
我有以下問題:
例如,我有這個 dataframe
> employee <- c('John Doe','Peter Gynn','Jolie Hope')
> salary <- c(NA, NA, NA)
> startdate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))
> employ.data <- data.frame(employee, salary, startdate)
我定義了這個列表
> l <- list("John Doe" = "23400",
"Peter Gynn" = "28000",
"Jolie Hoper" = "34000")
現在,我正在嘗試根據員工列的值並使用列表替換薪水列中的 NA 值。 有沒有使用 dplyr 的快速方法? 我正在尋找不同的情況,因為我在列表中有很多關鍵值......謝謝!
您可以使用dplyr
執行此操作,如下所示:
library(dplyr)
employ.data %>%
mutate(
salary = unlist(ifelse(is.na(salary) & employee %in% names(l), l[employee], salary))
)
您可以使用merge
:
#1. Convert your list to data.frame
salaries <- data.frame(employee = names(l), salary = unlist(l))
#2. Merge `salaries` with `employ.data`
merge(salaries, employ.data, by = "employee", all = TRUE)[-3]
employee salary.x startdate
1 John Doe 23400 2010-11-01
2 Jolie Hope 34000 2007-03-14
3 Peter Gynn 28000 2008-03-25
請注意,在我的示例中只有Jolie Hope
,您還有Jolie Hoper
我不知道這是否是一個錯字。 不過,如果Jolie Hoper
在您的列表中,此解決方案也將起作用。
在將命名list
stack
到兩列 data.frame 之后,我們可以使用 join on
與data.table
library(data.table)
setDT(employ.data)[stack(l), salary := values, on = .(employee = ind)]
employ.data
# employee salary startdate
#1: John Doe 23400 2010-11-01
#2: Peter Gynn 28000 2008-03-25
#3: Jolie Hope 34000 2007-03-14
或者在base R
中,根據名稱進行簡單的子集化
employ.data$salary <- with(employ.data, unlist(l[employee]))
l <- list("John Doe" = 23400,
"Peter Gynn" = 28000,
"Jolie Hope" = 34000)
employee <- c('John Doe','Peter Gynn','Jolie Hope')
salary <- rep(NA_real_, 3)
startdate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))
employ.data <- data.frame(employee, salary, startdate)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.