2015-08-07 7 views
1

Я осмотрелся, но не смог найти ответ, который помогает. Я пытаюсь настроить таблицу ключевых значений в R, где ключ определяется как диапазон или интервал, так что я могу сделать поиск, чтобы найти значение любой клавиши, которая попадает в диапазон/интервал. Чтобы дать минимальный пример, который не работает.R: определить значение как диапазон/интервал

data.frame(key = c(range(0, 1), 
        range(1, 2)), 
      value = c("A", 
        "B")) 

Кадр данных не будет проводить в два ряда, а четыре, так как R обрабатывает нижний и верхний интервал связан в виде двух отдельных значений и переработать столбец значение, чтобы прибыть в четыре ряда. Помимо этой проблемы, я также не мог найти функцию диапазона/интервала, где я могу определить нижнюю и верхнюю границы.

EDIT: Нужный результат будет таблицей, как это:

key  value  
(0, 1) "A" 
(1, 2) "B" 

Так что я мог бы сделать что-то вроде следующего запроса для значения а: таблицы $ значения [где% в% таблице $ ключ]

+2

Какой желаемый выход? –

+0

Не может ли это сделать функция 'findInterval'? –

+0

Да findInterval может сказать мне, если значение находится в моем диапазоне, но как определить столбец в фрейме данных для хранения значений, которые являются диапазонами? – Triamus

ответ

0

это не очень элегантно, но вы можете сделать это, чтобы сделать его практичным и удобным:

df = data.frame(values=letters[1:2]) 
df$keys=list(0:1, 1:2) 
# values keys 
#1  a 0, 1 
#2  b 1, 2 

Так что вам не нужно regex как при доступе к данным с помощью df$keys.

+0

да именно эта идея! –

+0

Это может помочь. Я сейчас борюсь за то, как эффективно возвращать значения из столбца значений для ввода, например. a <- 0,5. Я попробовал эти значения df $ [findInterval (a, df $ keys)]. Но это дает ошибку. Думаю, мне нужно использовать другой подход для списков? – Triamus

+1

вы можете сделать 'df $ values ​​[sapply (df $ keys, function (u) head (u, 1) <0.5 & 0.5 <= tail (u, 1))]' даже если я использую подход с столбцами, первая и вторая часть ключа, лучше. –

1

Если я правильно понял, вы хотите найти интервал, в котором происходит каждое значение. Если это так, то вы можете сделать это, найдя минимальные и максимальные «ключевые» номера для каждого из чисел «значение».

Это может быть легко достигнуто с помощью dplyr пакета следующим образом:

#If not installed do install.packages("dplyr") 
library(dplyr) 

#Provided example 
df = data.frame(key = c(range(0, 1),range(1, 2)), 
       value = c("A", "B")) 

#First group data by "value" variable 
# and then paste a vector with min and max of "key" variable 
df2 = df %>% 
     group_by(value) %>% 
     summarise(key = paste0("(", min(key), ",", max(key), ")")) 

Результат:

value key 
1  A (0,1) 
2  B (1,2) 

Вы можете легко получить значения в интервале, выполнив:

subset(df2, key == "(0,1)")$value 

Это решение является общим (неважно, сколько у вас значений). Кроме того, если это представляет интерес, вы могли бы так же легко вернуть минимальные и максимальные столбцы, вместо формата (min,max)

df3 = df %>% 
     group_by(value) %>% 
     summarise(min = min(key), 
       max = max(key)) 

Результаты в:

value min max 
1  A 0 1 
2  B 1 2 

И вы можете получить желаемый интервал, делая :

subset(df3, min >= 0 & max <= 1)$value 
+0

спасибо за тонну! нужно будет подробно изучить его в понедельник, когда время истекает. сообщит вам, если это лучше, чем решение @Colonel Beauvel. – Triamus