2015-09-01 4 views
0

используя R Я рассчитываю возраст на основе комбинации распределений. Этот возраст затем связан с centrain продолжительностью жизни, которая указана в таблице (или любой наиболее удобный способ это), как это:R: заменить значение значением из списка интервалов

age exp_life 
0-5  80 
6-10 75.38 
11-15 70.4 
16-20 65.41 
21-25 60.44 
26-30 etc.. 

Так, например, в возрасте 7 соотносится с 75.38, как я легко программу в R, чтобы посмотреть это?

Большое спасибо.

+0

Непонятно. Возможно, проверьте '? Merge' или'? Match' – akrun

+0

Или посмотрите, как обеспечить воспроизводимый пример. – Heroka

+0

Не совсем понятно, что вы хотите. У вас есть определенный возраст (а не возраст VALUES), которые связаны с значением «exp_life». Вы хотите связать значения возраста с значениями «exp_life»? Например: возрастное значение 7 относится к возрасту 6-10, поэтому оно связано с значением exp_life 75.38? – AntoniosK

ответ

2

использование findInterval(), чтобы найти exp_life соответствует age промежуток.

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

df <- read.table(header=TRUE, 
       text="age  exp_life 
         0-5  80 
         6-10 75.38 
         11-15 70.4 
         16-20 65.41 
         21-25 60.44 
         26-30 etc..", 
       stringsAsFactors =FALSE) 

library(tidyr); library(dplyr) 
df %>% 
    separate(age, into=c('from_age','to_age'), sep='-') %>% 
    mutate_each(funs(as.numeric)) %>% 
    arrange(from_age) -> df # in case it's not sorted 

df$exp_life[findInterval(7, df$from_age)] # returns [1] 75.38 
-1

Это процесс, который использует пакеты dplyr и tidyr для того, чтобы произвести новый набор данных, который имеет информацию о уровне «возрастной диапазон» и «значение возраст» уровень:

# example dataset 
dt = read.table(text= 
"age exp_life 
0-5  80 
6-10 75.38 
11-15 70.4 
16-20 65.41 
21-25 60.44", header=T) 

library(tidyr) 
library(dplyr) 

dt %>% 
    separate(age, c("low","high")) %>%    # split your range values into low and high 
    mutate(low = as.numeric(low),      # make those columns numeric 
     high = as.numeric(high)) %>% 
    rowwise() %>%          # for each row 
    do(data.frame(., 
       age_val=seq(.$low,.$high,1))) %>% # get all possible age values and combine them with ranges and exp_life values 
    ungroup 

# low high exp_life age_val 
# 1 0 5 80.00  0 
# 2 0 5 80.00  1 
# 3 0 5 80.00  2 
# 4 0 5 80.00  3 
# 5 0 5 80.00  4 
# 6 0 5 80.00  5 
# 7 6 10 75.38  6 
# 8 6 10 75.38  7 
# 9 6 10 75.38  8 
# 10 6 10 75.38  9 
# 11 6 10 75.38  10 
# 12 11 15 70.40  11 
# 13 11 15 70.40  12 
# 14 11 15 70.40  13 
# 15 11 15 70.40  14 
# 16 11 15 70.40  15 
# 17 16 20 65.41  16 
# 18 16 20 65.41  17 
# 19 16 20 65.41  18 
# 20 16 20 65.41  19 
# 21 16 20 65.41  20 
# 22 21 25 60.44  21 
# 23 21 25 60.44  22 
# 24 21 25 60.44  23 
# 25 21 25 60.44  24 
# 26 21 25 60.44  25 
+1

Это не отличное решение, потому что вы создаете ненужную большую таблицу поиска, когда все, что вам нужно сделать, это проверить интервалы. Вам не нужны «все возможные возрастные значения» в таблице. Кроме того, этот подход поиска не работает для дробных возрастов (10,5 и т. Д.). – C8H10N4O2

+0

Я согласен, что «findInterval» делает его более общим и намного лучше в случае, когда вам не нужна таблица поиска. Я ошибочно предположил, что возрастные значения будут целыми числами, и, как следствие, таблица поиска не является большой проблемой, так как у нее не будет много строк. – AntoniosK

Смежные вопросы