这是我在 R 中使用的数据:
library(Sleuth2)
ex22.20
我正在尝试将“年”列从数字范围(0-7)转换为两个数字之间的平均值(3.5)
任何帮助将不胜感激。
ex22.20$Years
这是一个解决方案,其中在应用之前的水平上计算平均值。
library(Sleuth2)
head(ex22.20)
# Exposure Years Deaths Risk
# 1 0 0-7 10 262
# 2 0 8-11 12 243
# 3 0 12-15 19 240
# 4 0 16-19 31 237
# 5 0 20-23 35 233
# 6 0 24-27 48 227
levels(ex22.20$Years)
# [1] "0-7" "8-11" "12-15" "16-19" "20-23" "24-27" "28-31"
mid.values <- sapply(strsplit(levels(ex22.20$Years), "-"),
function(x)mean(as.numeric(x)))
mid.values
# [1] 3.5 9.5 13.5 17.5 21.5 25.5 29.5
ex22.20$Years <- mid.values[ex22.20$Years]
head(ex22.20)
# Exposure Years Deaths Risk
# 1 0 3.5 10 262
# 2 0 9.5 12 243
# 3 0 13.5 19 240
# 4 0 17.5 31 237
# 5 0 21.5 35 233
# 6 0 25.5 48 227
这是一个从数据中获取特定行平均值的单行代码(第一个,在本例中为 0-7):
mean(range(lapply(strsplit(levels(ex22.20$Years)[1],"-"),as.numeric)))
哪个返回
[1] 3.5
解释:
levels
提取所需的数据字符串"0-7"
strsplit
将其转换为数字字符串列表[["0" "7"]]
lapply
申请as.numeric
并将其变成数字列表[[0 7]]
range
生成以这些数字为端点的范围mean
计算平均值。