根据不同的数据集对新列进行突变

如何解决根据不同的数据集对新列进行突变

示例我有三个数据集: df1_mean (基于df1的每个变量的平均值), df1_sd (基于df1的每个变量的sd)和 df2 (df2的值)。

df1_mean:

  A_mean B_mean C_mean D_mean E_mean
1     10     15     12     25     29

df1_sd:

  A_sd B_sd C_sd D_sd E_sd
1    3    2    5    4    2

df2:

  A  B  C  D  E
1 20 32 12 14 22
2 21 35 14 52 13
3 25 23 21 32 35
4 23 12 11 52 21
5 20 53 43 12 64
6 30 12 23 53 31

理想情况下,我想将 df1 中的*_mean*_sd中的每个变量(即分别为A,B,C,D,E)匹配> df2 ,然后mutate()根据公式创建一个新列,并为每个列输出新列。

对于每个变量,最终结果应类似于:

df2$A_output = (df2$A - df1$A_mean) / df1$A_sd

有人会知道是否有一种方法可以使用来自不同数据集的数据来mutate()个新列吗?还是最简单的自动化方法,而不是使用A_output = (A-10)/3,B_output = (B-15)/2,...手动进行?谢谢!

解决方法

以下是一些基本的R选项:

  • 使用rep
dfout <- (df2 - df1_mean[rep(1,nrow(df2)),])/df1_sd[rep(1,]
  • 使用sweep
dfout <- sweep(sweep(df2,2,unlist(df1_mean)),unlist(df1_sd),FUN = `/`)

两者都会给

> dfout
         A    B    C     D    E
1 3.333333  8.5  0.0 -2.75 -3.5
2 3.666667 10.0  0.4  6.75 -8.0
3 5.000000  4.0  1.8  1.75  3.0
4 4.333333 -1.5 -0.2  6.75 -4.0
5 3.333333 19.0  6.2 -3.25 17.5
6 6.666667 -1.5  2.2  7.00  1.0

数据

> dput(df1_mean)
structure(list(A_mean = 10L,B_mean = 15L,C_mean = 12L,D_mean = 25L,E_mean = 29L),class = "data.frame",row.names = "1")

> dput(df1_sd)
structure(list(A_sd = 3L,B_sd = 2L,C_sd = 5L,D_sd = 4L,E_sd = 2L),row.names = "1")

> dput(df2)
structure(list(A = c(20L,21L,25L,23L,20L,30L),B = c(32L,35L,12L,53L,12L),C = c(12L,14L,11L,43L,23L),D = c(14L,52L,32L,53L),E = c(22L,13L,64L,31L)),row.names = c("1","2","3","4","5","6"))
,

尝试一下

as.data.frame(Map(function(x,mu,sig) (x - mu) / sig,df2,df1_mean,df1_sd))

输出

         A    B    C     D    E
1 3.333333  8.5  0.0 -2.75 -3.5
2 3.666667 10.0  0.4  6.75 -8.0
3 5.000000  4.0  1.8  1.75  3.0
4 4.333333 -1.5 -0.2  6.75 -4.0
5 3.333333 19.0  6.2 -3.25 17.5
6 6.666667 -1.5  2.2  7.00  1.0
,

这是使用向量化数学和一些转置来进行回收工作的一种方法:

t( (t(df2) - unlist(df1_mean)) / unlist(df1_sd) )
#          A    B    C     D    E
# 1 3.333333  8.5  0.0 -2.75 -3.5
# 2 3.666667 10.0  0.4  6.75 -8.0
# 3 5.000000  4.0  1.8  1.75  3.0
# 4 4.333333 -1.5 -0.2  6.75 -4.0
# 5 3.333333 19.0  6.2 -3.25 17.5
# 6 6.666667 -1.5  2.2  7.00  1.0

它依赖于三个数据帧的列以相应的顺序。只要这成立,那它就会非常有效率。

,

尝试这种tidyverse方法:

library(tidyverse)
#Code
Output <- df2 %>% mutate(id=1:n()) %>% pivot_longer(-id) %>%
  left_join(df1_mean %>% pivot_longer(everything()) %>%
              separate(name,c('name','Var'),sep='_') %>%
              rename(Mean=value) %>% select(-Var)
  ) %>%
  left_join(
    df1_sd %>% pivot_longer(everything()) %>%
      separate(name,sep='_') %>%
      rename(SD=value) %>% select(-Var)
  ) %>% mutate(Val=(value-Mean)/SD) %>% select(-c(value,Mean,SD)) %>%
  pivot_wider(names_from = name,values_from=Val) %>% select(-id)

输出:

# A tibble: 6 x 5
      A     B     C     D     E
  <dbl> <dbl> <dbl> <dbl> <dbl>
1  3.33   8.5   0   -2.75  -3.5
2  3.67  10     0.4  6.75  -8  
3  5      4     1.8  1.75   3  
4  4.33  -1.5  -0.2  6.75  -4  
5  3.33  19     6.2 -3.25  17.5
6  6.67  -1.5   2.2  7      1  

使用了一些数据:

#Data 1
df1_mean <- structure(list(A_mean = 10L,row.names = "1")

#Data 2
df1_sd <-structure(list(A_sd = 3L,row.names = "1")

#Data 3
df2 <- structure(list(A = c(20L,"6"))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-