Как найти наименьшее положительное и отрицательное значение при определенном условии в R? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть фрейм данных, который выглядит следующим образом:

изображение фрейма данных

highopen_percent_change <- c(0.285, -2.156, 0.030, -0.184, -0.005, 0,092, -0.092, 0, -0.0563, -0.020, -0.174, -0.492, 0.201, -0.005)
IDcombinatie_nr <- c(47, 41, 42, 45, 41, 42, 48, 32, 44, 48, 32, 48, 32, 48, 28, 12, 32)
df <- data.frame(highopen_percent_change, IDcombinatie_nr)

В этом фрейме данных я хочу знать самые маленькие положительные и отрицательные значение highopen_percent_change за IDcombinatie_nr. Итак, по IDcombinatie_nr я хочу знать, каковы наименьшие положительные и отрицательные значения highopen_percent_change. Это значение не должно быть нулевым, так как некоторые значения highopen_percent_change равны нулю в моем фрейме данных.

Итак, это то, что я хочу:

Для 47 самое низкое положительное значение равно 0,05 и самое низкое отрицательное значение равно -0,1.

Для 41 самое низкое положительное значение равно 0,02, а самое низкое отрицательное значение равно -0,4.

Для 42 самое низкое положительное значение равно 0,3, а самое низкое отрицательное значение -0,2.

Надеюсь, вы мне поможете.

Ответы [ 3 ]

0 голосов
/ 15 апреля 2020

В R base вы можете использовать tapply плюс поднабор:

min.pos <- tapply(df$highopen_percent_change[df$highopen_percent_change > 0],
                 df$IDcombinatie_nr[df$highopen_percent_change > 0], min)

min.neg <- tapply(df$highopen_percent_change[df$highopen_percent_change < 0],
                 df$IDcombinatie_nr[df$highopen_percent_change < 0], min)
0 голосов
/ 15 апреля 2020

Используя data.table , удалите строки с 0 значениями, сгруппируйте по идентификатору и знак (> 0), получите минимум, наконец измените форму с длинного на широкий, используя dcast :

library(data.table)

# updated example data:
dt <- data.table(
  highopen_percent_change = c(0.285, -2.156, 0.030, -0.184, -0.005, 0.092, -0.092, 0, -0.0563, -0.020, -0.174, -0.492, 0.201, -0.005, 0.530, -0.445),
  IDcombinatie_nr = c(47, 41, 42, 45, 41, 42, 48, 32, 44, 48, 32, 48, 32, 48, 28, 12))

# result
dcast(dt[highopen_percent_change != 0, .(myMin = min(highopen_percent_change)), 
         by = .(IDcombinatie_nr, 
                grp = ifelse(highopen_percent_change > 0, "minPositive", "minNegative"))], 
      IDcombinatie_nr ~ grp, value.var = "myMin")
#    IDcombinatie_nr minNegative minPositive
# 1:              12     -0.4450          NA
# 2:              28          NA       0.530
# 3:              32     -0.1740       0.201
# 4:              41     -2.1560          NA
# 5:              42          NA       0.030
# 6:              44     -0.0563          NA
# 7:              45     -0.1840          NA
# 8:              47          NA       0.285
# 9:              48     -0.4920          NA
0 голосов
/ 15 апреля 2020

Не предоставляя данных, попробуйте:

require(dplyr)

minpositive = function(x) min(x[x > 0])
maxnegative = function(x) max(x[x < 0])

df %>% 
   group_by(IDcombinatie_nr) %>% 
   summarise(Value = c(minpositive(highopen_percent_change),
                       maxnegative(highopen_percent_change))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...