R. Как создать новый столбец, возвращая i на основе другого столбца в R - PullRequest
0 голосов
/ 06 октября 2018

У меня есть фрейм данных

employee <- c('John Doe','Peter Gynn','Jolie Hope')
salary <- c(21000, NA, 26800)
startdate <- as.Date(c('2010-11-1', NA,'2007-3-14'))

employ.data <- data.frame(employee, salary, startdate)

Я хочу новый столбец employee.data $ NA, который возвращает i в employ.data$employee, если [i] в любой другой строке - NA.

Я пробовал это для 1 столбца, но получаю ошибки

employ.data$NA = NA 
{for (i in 1:nrow(Eurostat)) 
  {
  if (startdate[i] = "NA")  employ.data$employee[i]
}

Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

Вам нужно complete.cases() от базы R -

employ.data$missingFlag <- !complete.cases(employ.data)

    employee salary  startdate missingFlag
1   John Doe  21000 2010-11-01       FALSE
2 Peter Gynn     NA       <NA>        TRUE
3 Jolie Hope  26800 2007-03-14       FALSE
0 голосов
/ 06 октября 2018

Это легко сделать с помощью dplyr:

library(dplyr)

employee <- c('John Doe','Peter Gynn','Jolie Hope')
salary <- c(21000, NA, 26800)
startdate <- as.Date(c('2010-11-1', NA,'2007-3-14'))

employ.data <- data.frame(employee, salary, startdate)

employ.data <- employ.data %>% 
  rowwise() %>% 
  mutate(missing = any(is.na(c(salary, startdate))))
0 голосов
/ 06 октября 2018

Попробуйте векторизовать его и использовать оператор ifelse:

employ.data <- data.frame(employee, salary, startdate, stringsAsFactors = F)
employ.data["missing"] = with(employ.data, ifelse(is.na(startdate), employee, NA))
employ.data
    employee salary  startdate    missing
1   John Doe  21000 2010-11-01       <NA>
2 Peter Gynn     NA       <NA> Peter Gynn
3 Jolie Hope  26800 2007-03-14       <NA>

В качестве альтернативы, чтобы проверить все столбцы, используйте any:

employ.data <- data.frame(employee, salary, startdate, stringsAsFactors = F)
employ.data["something_missing"] = apply(employ.data, 1, function(x) any(is.na(x)))
employ.data
    employee salary  startdate something_missing
1   John Doe  21000 2010-11-01             FALSE
2 Peter Gynn     NA       <NA>              TRUE
3 Jolie Hope  26800 2007-03-14             FALSE

Конструкция выше даствы булевыЕсли вы хотите получить столбец имен, вы можете объединить его с ifelse.

На более общей ноте: сначала создавать экземпляр столбца, а затем циклически перебирать фрейм данных, чтобы заполнить его, не особенно Rtistic, и я бы предложил по возможности избегать этой стратегии.apply -семейство функций очень мощное, и ifelse тоже.dplyr mutate в сочетании с case_when статистиками также можно использовать в случае, если вы хотите что-то более похожее на SQL.

Просто по педагогическим причинам, вот ваш код в рабочей версии.Пожалуйста, не используйте его, просто попытайтесь понять различия.

employ.data$missing = NA 
for (i in 1:nrow(employ.data)) {
  if (is.na(employ.data$startdate[i])){ 
         employ.data$missing[i] <- employ.data$employee[i]
        }
}

Важно отметить, что "NA" интерпретируется как строка.Чтобы проверить, является ли значение NA, вам нужно использовать, например, is.na.В конце концов, тестирование 42 == NA неоднозначно.Значение отсутствует.Может быть или не быть равным 42, поэтому тест вернет NA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...