0

这是我在 R 中使用的数据:

library(Sleuth2)
ex22.20

我正在尝试将“年”列从数字范围(0-7)转换为两个数字之间的平均值(3.5)

任何帮助将不胜感激。

4

2 回答 2

7

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
于 2012-05-03T01:55:15.997 回答
3

这是一个从数据中获取特定行平均值的单行代码(第一个,在本例中为 0-7):

mean(range(lapply(strsplit(levels(ex22.20$Years)[1],"-"),as.numeric)))

哪个返回

[1] 3.5

解释:

  1. 用于levels提取所需的数据字符串"0-7"
  2. 用于strsplit将其转换为数字字符串列表[["0" "7"]]
  3. 用于lapply申请as.numeric并将其变成数字列表[[0 7]]
  4. 用于range生成以这些数字为端点的范围
  5. 用于mean计算平均值。
于 2012-05-03T02:08:39.813 回答