如何收集然后突变一个新列,然后再次扩展为宽格式

编程入门 行业动态 更新时间:2024-10-10 14:25:46
本文介绍了如何收集然后突变一个新列,然后再次扩展为宽格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

使用tidyr/dplyr,我有一些因子列想要Z得分,然后变异平均Z得分,同时保留原始数据以供参考.

Using tidyr/dplyr, I have some factor columns which I'd like to Z-score, and then mutate an average Z-score, whilst retaining the original data for reference.

我想避免在tidyr/dplyr中使用for循环,因此我要收集数据并在单列上执行计算(Z分数).但是,我正在努力恢复宽格式.

I'd like to avoid using a for loop in tidyr/dplyr, thus I'm gathering my data and performing my calculation (Z-score) on a single column. However, I'm struggling with restoring the wide format.

这是MWE:

library(dplyr) library(tidyr) # Original Data dfData <- data.frame( Name = c("Steve","Jwan","Ashley"), A = c(10,20,12), B = c(0.2,0.3,0.5) ) %>% tbl_df() # Gather to Z-score dfLong <- dfData %>% gather("Factor","Value",A:B) %>% mutate(FactorZ = paste0("Z_",Factor)) %>% group_by(Factor) %>% mutate(ValueZ = (Value - mean(Value,na.rm = TRUE))/sd(Value,na.rm = TRUE)) # Now go wide to do some mutations (eg Z)Avg = (Z_A + Z_B)/2) # This does not work dfWide <- dfLong %>% spread(Factor,Value) %>% spread(FactorZ,ValueZ)%>% mutate(Z_Avg = (Z_A+Z_B)/2) # This is the desired result dfDesired <- dfData %>% mutate(Z_A = (A - mean(A,na.rm = TRUE))/sd(A,na.rm = TRUE)) %>% mutate(Z_B = (B - mean(B,na.rm = TRUE))/sd(B,na.rm = TRUE)) %>% mutate(Z_Avg = (Z_A+Z_B)/2)

感谢您的帮助/输入!

推荐答案

使用 dplyr (版本0.5.0)的另一种方法

Another approach using dplyr (version 0.5.0)

library(dplyr) dfData %>% mutate_each(funs(Z = scale(.)), -Name) %>% mutate(Z_Avg = (A_Z+B_Z)/2)

更多推荐

如何收集然后突变一个新列,然后再次扩展为宽格式

本文发布于:2023-10-17 09:20:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1500455.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:突变   格式

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!