根据条件更改同一列的值

时间:2019-06-07 19:48:47

标签: r

我在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时,日期无关紧要

2 个答案:

答案 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