我有两个数据帧,一个具有三列(DateTimeStamp
,Temperature
和Flag
),第二个具有一列的列具有需要用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循环,因为我有多个站点,这些站点有很多年并且有很多唯一的标志代码。
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
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函数。