Для l oop замените определенные помеченные данные на NA в R - PullRequest
0 голосов
/ 04 мая 2020

У меня есть два фрейма данных, один с тремя столбцами (DateTimeStamp, Temperature и Flag), а второй с одним столбцом, в котором есть коды флагов, которые необходимо заменить значениями NA. Я хотел бы запустить для l oop, который проверяет второй (один столбец) фрейм данных на соответствие кодам флагов в первом (три столбца) фрейме данных. Если обнаружен флаг, то значение Temperature для этой отмеченной строки будет заменено значением NA.

Вот первый кадр данных

> head(dat, n = 10)
          DateTimeStamp    Temperature             Flag
 1: 2002-01-01 00:00:00            5.5              <4>
 2: 2002-01-01 00:15:00            5.3              <4>
 3: 2002-01-01 00:30:00            0.2             <-3>
 4: 2002-01-01 00:45:00            4.8              <4>
 5: 2002-01-01 01:15:00            4.4              <4>
 6: 2002-01-01 01:30:00            8.9             <-2>
 7: 2002-01-01 01:45:00            4.3              <4>
 8: 2002-01-01 02:15:00            4.0              <4>
 9: 2002-01-01 02:30:00            3.9              <4>
10: 2002-01-01 02:45:00            3.3              <4>

, а вот второй фрейм данных кодов флагов, который должен заменить значение Temperature значением NA.

> head(dat_remove_codes)
  dat_remove_codes
1             <-2> 
2             <-3>

На выходе, который я хотел бы, был бы отдельный фрейм данных, который выглядит следующим образом

> head(dat_clean, n = 10)
          DateTimeStamp    Temperature             Flag
 1: 2002-01-01 00:00:00            5.5              <4>
 2: 2002-01-01 00:15:00            5.3              <4>
 3: 2002-01-01 00:30:00             NA             <-3>
 4: 2002-01-01 00:45:00            4.8              <4>
 5: 2002-01-01 01:15:00            4.4              <4>
 6: 2002-01-01 01:30:00             NA             <-2>
 7: 2002-01-01 01:45:00            4.3              <4>
 8: 2002-01-01 02:15:00            4.0              <4>
 9: 2002-01-01 02:30:00            3.9              <4>
10: 2002-01-01 02:45:00            3.3              <4>

Я хотел бы использовать для этого l oop, если возможно, так как у меня есть несколько сайтов с многолетним опытом и множеством уникальных кодов флагов.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Что нужно повторить для l oop? Самый простой способ, который я нашел, заключается в следующем. Он просто составляет указатель того, какие строки требуют NA, а затем добавляет их в столбец температуры.

#Making quick dummy data
dat <- data.frame(temp <- c(1,3,4,5,2),
           flag <- c("<4>", "<3>","<-2>","<4>", "<8>")
           , stringsAsFactors = FALSE)


colnames(dat) <- c("Temperature", "flag")

dat_remove_codes <- data.frame("<-2>", "<8>", stringsAsFactors = FALSE)

#the code you need
dat[dat$flag %in% dat_remove_codes[1,],"Temperature"] <- NA
0 голосов
/ 04 мая 2020

R - это векторизованный язык, для l oop не требуется. Сначала мы создаем воспроизводимые образцы данных с помощью dput, кстати. хорошая идея для вашего следующего вопроса SO.

Затем мы можем заменить помеченные данные функцией ifelse:

## dump of data frame
dat <- structure(list(DateTimeStamp = structure(c(1009843200, 1009844100, 
  1009845000, 1009845900, 1009847700, 1009848600, 1009849500, 1009851300, 
  1009852200, 1009853100), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
  Temperature = c(5.5, 5.3, 0.2, 4.8, 4.4, 8.9, 4.3, 4, 3.9, 
  3.3), Flag = c("<4>", "<4>", "<-3>", "<4>", "<4>", "<-2>", 
  "<4>", "<4>", "<4>", "<4>")), class = c("spec_tbl_df", "tbl_df", 
  "tbl", "data.frame"), row.names = c(NA, -10L), spec = structure(list(
  cols = list(DateTimeStamp = structure(list(format = ""), class = c("collector_datetime", 
  "collector")), Temperature = structure(list(), class = c("collector_double", 
  "collector")), Flag = structure(list(), class = c("collector_character", 
  "collector"))), default = structure(list(), class = c("collector_guess", 
  "collector")), skip = 1), class = "col_spec"))

## remove codes
dat_remove_codes <- c("<-2>", "<-3>")

## show original data frame
head(dat)

## replacement
dat$Temperature <- ifelse(dat$Flag %in% dat_remove_codes, NA, dat$Temperature)

## changed data
head(dat)

Если у вас несколько таких таблиц, a для l oop или может войти функция применения.

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