我从调查中得到大数据框tocalculate
(原始数据框brfss2013
,其中一个变量代表一个人检查血糖水平的次数。数据为3位数:< / p>
第一个数字告诉您测量是每天(1),每周(2),每月(3)还是每年(4)。第二个和第三个数字代表实际值。
示例:101每天一次(_01)(1 _ _),202每周两次,等等。
我希望标准化所有内容以获得每年的价值。所以我会将第2和第3位乘以365,52.143,12和1(天,周,月,年)。
我想我能够选择&#34;要使用的数字,但我不确定如何编写可以使用不同指令集处理不同行的内容。
编辑:
添加我的尝试和示例数据。
tocalculate <- brfss2013 %>%
filter(nchar(bldsugar) > 2)
bldsugar2 <- sapply(tocalculate$bldsugar, function(x) {
if (substr(x,1,1) == 1) {x*365}
if (substr(x,1,1) == 2) {x*52}
if (substr(x,1,1) == 3) {x*12}
if (substr(x,1,1) == 4) {x*365}
})
我获得了很多NULL值但是......
答案 0 :(得分:3)
由于您已经在使用dplyr
,recode
是一个方便的功能。我使用%/%
查看100次进入每个bldsugar
值的次数和%%
,以便在除以100时得到余数。
# sample data
brfss_sample = data.frame(bldsugar = c(101, 102, 201, 202, 301, 302, 401, 402))
library(dplyr)
mutate(
brfss_sample,
mult = recode(
bldsugar %/% 100,
`1` = 365.25,
`2` = 52.143,
`3` = 12,
`4` = 1
),
checks_per_year = bldsugar %% 100 * mult
)
# bldsugar mult checks_per_year
# 1 101 365.250 365.250
# 2 102 365.250 730.500
# 3 201 52.143 52.143
# 4 202 52.143 104.286
# 5 301 12.000 12.000
# 6 302 12.000 24.000
# 7 401 1.000 1.000
# 8 402 1.000 2.000
当然,您可以删除mult
列(或合并定义,以便从不创建它。)
答案 1 :(得分:2)
#Data
set.seed(42)
x = sample(101:499, 100, replace = TRUE)
#1st digit
as.factor(floor((x/100)))
#Values
((x/100) %% 1) * 100
答案 2 :(得分:0)
也许您可以做的第一件事就是将3位变量分成两个变量。第一个变量只有一位数,表示采样频率;第二个变量显示测量时间。
在R中,substr
或substring
可以通过指定子集的第一个和最后一个位置来选择字符串。
# Create example data frame
ex_data <- data.frame(var = c("101", "202", "204"))
# Split the variable to create two new columns
ex_data$var1 <- substring(ex_data$var, first = 1, last = 1)
ex_data$var2 <- substring(ex_data$var, first = 2, last = 3)
# Remove the original variable
ex_data$var <- NULL
在此之后,您可以操纵数据框。也许将var1
转换为因子和var2
为数字,以便进一步操作和分析。