#r #dplyr
Вопрос:
Привет, у меня есть простой фрейм данных с 2 столбцами
scenario item ROA
0 -10 0 A 6.0
0 0 10 A 2.1
0 10 20 A 3.0
0 -30 0 B 0.5
10 0 0 B 1.0
Что мне нужно, так это создать способ, позволяющий определять сценарии для каждого элемента (только положительные или отрицательные) и возвращать строку, в которой есть максимальное значение ROA
Например, если я прикажу A использовать только положительные сценарии, а B-только отрицательные, я должен получить
scenario item ROA
0 10 20 A 3.0
0 -30 0 B 0.5
значения в столбце сценарий являются строками, а не числами, но есть только один отрицательный знак, поэтому его можно проверить с помощью условия, если он содержит знак» -«.
условием для отрицательного сценария является только то, что в строке есть отрицательный символ, условием для положительного является то, что он этого не делает.
Здесь вы можете создать некоторые примеры данных
scenario <- c("0 -10 0","0 0 10","0 10 20","0 -30 0","0 -30 0")
item <- c("A","A","A","B","B")
ROA <- c(6,2.1,3,0.5,1)
dfts <- data.frame(scenario=scenario, item=item, ROA=ROA )
Спасибо за помощь
Комментарии:
1. вы заявили, что столбец сценария имеет строковый тип, не могли бы вы предоставить воспроизводимые данные, чтобы избежать какой-либо путаницы? Где ваши условия хранения предметов? т. е. какие из них положительные, а какие отрицательные, или они должны быть жестко закодированы?
2. @AnilGoyal Я добавил больше информации и некоторые примеры данных
Ответ №1:
Вот еще один подход: я использовал strsplit
функцию из базы R, которая разбивает строку на основе sep
аргумента, который здесь представляет собой один пробел " "
. Эта функция возвращает список той же длины, что и тот, в x
котором ith
элемент списка состоит из отдельных элементов x[i]
. Здесь каждый ваш элемент scenario
имеет длину 1
. Затем я выбрал второй отдельный элемент и преобразовал его в числовой класс:
library(dplyr)
library(purrr)
dfts %>%
filter(map2_lgl(scenario, item, ~ (.y == "A" amp; as.numeric(strsplit(.x, " ")[[1]][2]) > 0) |
(.y == "B" amp; as.numeric(strsplit(.x, " ")[[1]][2]) < 0)))
scenario item ROA
1 0 10 20 A 3.0
2 0 -30 0 B 0.5
Ответ №2:
Базовый вариант R
subset(
subset(
dfts,
(1 grepl("-", scenario)) == match(item, c("A", "B"))
),
ave(ROA, item, FUN = max) == ROA
)
дает
scenario item ROA
3 0 10 20 A 3.0
4 0 -30 0 B 0.5
Ответ №3:
Вы ищете это?
library(dplyr)
dfts %>%
filter((!grepl('-', scenario) amp; item == 'A') |
grepl('-', scenario) amp; item == 'B') %>%
group_by(item) %>%
slice(which.max(ROA)) %>%
ungroup
# scenario item ROA
# <chr> <chr> <dbl>
#1 0 10 20 A 3
#2 0 -30 0 B 0.5
Ответ №4:
Мы можем использовать
library(dplyr)
library(stringr)
dfts %>%
filter(!str_detect(scenario, '-') amp; item == 'A'|
str_detect(scenario, '-') amp; item == 'B') %>%
group_by(item) %>%
slice_max(n = 1, order_by = ROA)