我在Net.Chg
列中有一个值为负,正和零的值列表。我想用1
替换所有零(如果后面跟一个正数),如果用-1
替换所有零(如果后面跟一个负数)。
这是示例数据
Time.Interval Net.Chg
2-Jan-17 _00:00:00.000000 NA
19:15 - 19:16 -0.0047
19:16 - 19:17 0
19:17 - 19:18 0
3-Jan-17 _00:00:00.000000 NA
03:45 - 03:46 0
03:54 - 03:55 -0.0002
19:43 - 19:44 -0.0008
20:01 - 20:02 0.0025
4-Jan-17 _00:00:00.000000 NA
00:54 - 00:55 0
01:10 - 01:11 0.0005
01:11 - 01:12 0
我关心的是将所有正值都更改为1
,并将所有负值都更改为-1
。我使用了以下代码
data$Net.Chg <- sign(Net.Chg)
,但不能与零一起使用。
Time.Interval <- c('2-Jan-17 _00:00:00.000000', '19:15 - 19:16', '19:16 - 19:17', '19:17 - 19:18', '3-Jan-17 _00:00:00.000000', '03:45 - 03:46', '03:54 - 03:55', '19:43 - 19:44', '20:01 - 20:02', '4-Jan-17 _00:00:00.000000', '00:54 - 00:55', '01:10 - 01:11', '01:11 - 01:12')
Net.Chg <- c(NA, -0.0047, 0, 0, NA, 0, -0.0002, -0.0008, 0.0025, NA, 0, 0.0005, 0)
data <- data.frame(Time.Interval, Net.Chg)
必填项应该是
Time.Interval Net.Chg Required
2-Jan-17 _00:00:00.000000 NA NA
19:15 - 19:16 -0.0047 -1
19:16 - 19:17 0 -1
19:17 - 19:18 0 -1
3-Jan-17 _00:00:00.000000 NA NA
03:45 - 03:46 0 -1
03:54 - 03:55 -0.0002 -1
19:43 - 19:44 -0.0008 -1
20:01 - 20:02 0.0025 1
4-Jan-17 _00:00:00.000000 NA NA
00:54 - 00:55 0 1
01:10 - 01:11 0.0005 1
01:11 - 01:12 0 1
如果您将“零”更改为1
和-1
时,日期无关紧要
答案 0 :(得分:1)
那是一个简单的解决方案:
library(tidyverse)
data %>%
mutate(
Required = case_when(
Net.Chg > 0 ~ 1,
Net.Chg < 0 ~ -1,
TRUE ~ NA_real_
)
) %>%
fill(Required) %>%
mutate(Required = ifelse(is.na(Net.Chg), NA, Required))
首先,如果1
或-1
大于或小于零,则可以将其分配给Require
。
第二,我们可以向下填充它。
第三,恢复NA
值。
仅此而已!
这是最后两列的输出:
Net.Chg Required
1 NA NA
2 -0.0047 -1
3 0.0000 -1
4 0.0000 -1
5 NA NA
6 0.0000 -1
7 -0.0002 -1
8 -0.0008 -1
9 0.0025 1
10 NA NA
11 0.0000 1
12 0.0005 1
13 0.0000 1
答案 1 :(得分:0)
library(zoo)
df <- data.frame(Net.chg = c(NA, -0.0047, 0, 0, NA, 0, -0.002, -0.008, 0.0025, NA, 0, 0.005, 0))
获取NA值的行索引
ri <- is.na(df$Net.chg)
用NA替换全0
df$Net.chg[df$Net.chg == 0] <- NA
使用Zoo软件包中的locf()填充具有先前编号的NAs
df$Net.chg <- na.locf(df$Net.chg, na.rm = F)
然后将负数转换为-1,将正数转换为1
df$Net.chg[df$Net.chg < 0] <- -1
df$Net.chg[df$Net.chg > 0] <- 1
在列中再次填充原始NA值
df[ri,] <- NA