簡體   English   中英

如何根據另一列的值替換 R 中的 NA 值?

[英]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 ondata.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM