For循环用R中的NA替换某些标记的数据

问题描述 投票:0回答:2

我有两个数据帧,一个具有三列(DateTimeStampTemperatureFlag),第二个具有一列的列具有需要用NA值替换的标志代码。我想运行一个for循环,对照第一(三列)数据帧中的标志代码检查第二(一列)数据帧。如果遇到标记,则该标记行的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>

如果可能的话,我想为此使用一个for循环,因为我有多个站点,这些站点有很多年并且有很多唯一的标志代码。

r for-loop time-series qa
2个回答
1
投票

for循环需要迭代什么?我发现的最简单的方法如下。它只是对需要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
投票

R是向量化语言,不需要for循环。首先,我们用dput btw创建可重现的样本数据。下一个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)

如果您有几个这样的表,可能会出现for循环或apply函数。

© www.soinside.com 2019 - 2024. All rights reserved.