R:用间隔列表中的值替换值

时间:2015-09-01 12:09:35

标签: r

使用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中轻松编程来查看呢?

非常感谢。

2 个答案:

答案 0 :(得分: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 :(得分:-1)

这是一个使用包dplyrtidyr的流程,以便生成一个新的数据集,其中包含“年龄段”级别和“年龄值”级别的信息:

# 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