Изменение значений одного и того же столбца в зависимости от условия - PullRequest
0 голосов
/ 07 июня 2019

У меня есть список значений в столбце 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 ]

1 голос
/ 07 июня 2019

Это простое решение:

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
0 голосов
/ 07 июня 2019
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) 

Замена всех 0 на NA

df$Net.chg[df$Net.chg == 0] <- NA

Заполнение NA предыдущими номерами с помощью locf () из пакета zoo

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...