首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据R中的另一个范畴变量(使用based )对变量值进行不同的标准化

根据R中的另一个范畴变量(使用based )对变量值进行不同的标准化
EN

Stack Overflow用户
提问于 2022-04-20 18:59:35
回答 1查看 37关注 0票数 0

我有一个大型数据集,其中有一个连续变量“胆固醇”,用于每个参与者进行两次访问(每个参与者有两行:第一次访问=前&第二次访问之后)。我想控制胆固醇,但我在访问前后都合并了,这将使我的标准化工作不准确,因为它是用平均值和SD来计算的。

使用R基,如何在访问相同数据集的基础上创建一个新的胆固醇变量(在此过程中,标准化应该进行两次;一次是在之前,另一次是在之后,但是输出(标准化值)将再次位于一个变量中,并遵循此DF的相同结构。

代码语言:javascript
复制
DF$Cholesterol<- c( 0.9861551,2.9154158, 3.9302373,2.9453085, 4.2248018,2.4789901, 0.9972635, 0.3879830, 1.1782336, 1.4065341,  1.0495609,1.2750138, 2.8515144, 0.4369885, 2.2410429, 0.7566147,       3.0395565,1.7335131, 1.9242212, 2.4539439, 2.8528908, 0.8432039,1.7002653, 2.3952744,2.6522959, 1.2178764, 2.3426695, 1.9030782,1.1708246,2.7267124)


DF$Visit< -c(Before,After,Before,After,Before,After,Before,After,Before,After,Before,After,Before,After,Before,After,Before,After,Before,After,Before,After,Before,After,Before, After,Before,After,Before,After) 


# the standardisation function I want to apply
standardise <- function(x) {return((x-min(x,na.rm = T))/sd(x,na.rm = T))}

先谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-20 19:17:09

让我们制作您的数据,修复df$访问分配,将标准化函数修正为平均而不是最小,然后假设以前的每一个新时刻都是下一个人,转向宽格式,然后对标准化前后的变量进行变异:

代码语言:javascript
复制
df <- data.frame(x = rep(1, 30))
df$cholesterol<- c( 0.9861551,2.9154158, 3.9302373,2.9453085, 4.2248018,2.4789901, 0.9972635, 0.3879830, 1.1782336, 1.4065341,  1.0495609,1.2750138, 2.8515144, 0.4369885, 2.2410429, 0.7566147,       3.0395565,1.7335131, 1.9242212, 2.4539439, 2.8528908, 0.8432039,1.7002653, 2.3952744,2.6522959, 1.2178764, 2.3426695, 1.9030782,1.1708246,2.7267124)
df$visit <- rep(c("before", "after"), 15)

standardise <- function(x) {return((x-mean(x,na.rm = T))/sd(x,na.rm = T))}

df <- df %>%
  mutate(person = cumsum(visit == "before"))%>%
  pivot_wider(names_from = visit, id_cols = person, values_from = cholesterol)%>%
  mutate(before_std = standardise(before),
         after_std = standardise(after))

给予:

代码语言:javascript
复制
   person before after before_std after_std
    <int>  <dbl> <dbl>      <dbl>     <dbl>
 1      1  0.986 2.92     -1.16     1.33   
 2      2  3.93  2.95      1.63     1.36   
 3      3  4.22  2.48      1.91     0.842  
 4      4  0.997 0.388    -1.15    -1.49   
 5      5  1.18  1.41     -0.979   -0.356  
 6      6  1.05  1.28     -1.10    -0.503  
 7      7  2.85  0.437     0.609   -1.44   
 8      8  2.24  0.757     0.0300  -1.08   
 9      9  3.04  1.73      0.788    0.00940
10     10  1.92  2.45     -0.271    0.814  
11     11  2.85  0.843     0.611   -0.985  
12     12  1.70  2.40     -0.483    0.749  
13     13  2.65  1.22      0.420   -0.567  
14     14  2.34  1.90      0.126    0.199  
15     15  1.17  2.73     -0.986    1.12  

如果您实际上希望min在您的标准化功能,而不是平均,编辑应该足够简单。

为BaseR解决方案进行了编辑,但附带了一个警告性的故事:可能有一个更整洁的解决方案:

代码语言:javascript
复制
df <- data.frame(id = rep(c(seq(1, 15, 1)), each = 2))
df$cholesterol<- c( 0.9861551,2.9154158, 3.9302373,2.9453085, 4.2248018,2.4789901, 0.9972635, 0.3879830, 1.1782336, 1.4065341,  1.0495609,1.2750138, 2.8515144, 0.4369885, 2.2410429, 0.7566147,       3.0395565,1.7335131, 1.9242212, 2.4539439, 2.8528908, 0.8432039,1.7002653, 2.3952744,2.6522959, 1.2178764, 2.3426695, 1.9030782,1.1708246,2.7267124)

df$visit <- rep(c("before", "after"), 15)

df <- reshape(df, direction = "wide", idvar = "id", timevar = "visit")

standardise <- function(x) {return((x-mean(x,na.rm = T))/sd(x,na.rm = T))}

df$before_std <- round(standardise(df$cholesterol.before), 2)
df$aafter_std <- round(standardise(df$cholesterol.after), 2)

给予:

代码语言:javascript
复制
i id cholesterol.before cholesterol.after before_std after_std
1   1          0.9861551         2.9154158      -1.16      1.33
3   2          3.9302373         2.9453085       1.63      1.36
5   3          4.2248018         2.4789901       1.91      0.84
7   4          0.9972635         0.3879830      -1.15     -1.49
9   5          1.1782336         1.4065341      -0.98     -0.36
11  6          1.0495609         1.2750138      -1.10     -0.50
13  7          2.8515144         0.4369885       0.61     -1.44
15  8          2.2410429         0.7566147       0.03     -1.08
17  9          3.0395565         1.7335131       0.79      0.01
19 10          1.9242212         2.4539439      -0.27      0.81
21 11          2.8528908         0.8432039       0.61     -0.99
23 12          1.7002653         2.3952744      -0.48      0.75
25 13          2.6522959         1.2178764       0.42     -0.57
27 14          2.3426695         1.9030782       0.13      0.20
29 15          1.1708246         2.7267124      -0.99      1.12
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71944919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档