【问题标题】:Running into error coercing data.frame to numerical values遇到将 data.frame 强制转换为数值的错误
【发布时间】:2017-12-30 18:09:49
【问题描述】:

我在这里有一个名为“matched_SNPs”的data.frame:

  SNP               ACB               ASW               BEB          EFF
rs10007883 0.536458333333333 0.549180327868853 0.191860465116279    -0.005748
rs10009522 0.604166666666667 0.475409836065574 0.162790697674419     0.008854
rs10010325 0.458333333333333 0.467213114754098 0.453488372093023    -0.006217
rs10010809             0.375 0.401639344262295 0.290697674418605     0.005879
rs10015151 0.572916666666667 0.442622950819672 0.546511627906977    -0.005789
rs10016978            0.5625 0.565573770491803 0.424418604651163    -0.005444

我想创建一个基于第 2、3 和 4 列的值乘以第 5 列的新数据框,其格式如下:

ACB   ASW   BEB
value value value
value value value
value value value
value value value

我试过了 new_df=(as.numeric(as.character(matched_SNPs[,2:4]))*as.numeric(as.character(matched_SNPs$EFF)))

but all I get is: Warning messages:
1: NAs introduced by coercion 
2: In as.numeric(as.character(matched_SNPs[, 2:4])) * as.numeric(as.character(matched_SNPs$EFF)) :
  longer object length is not a multiple of shorter object length

我也尝试过更基本的weighted_freqs=(matched_SNPs[,2:27])*(matched_SNPs$EFF),但我收到一条警告消息,上面写着In Ops.factor(left, right) : '*' not meaningful for factors

我该如何解决这个问题?

【问题讨论】:

    标签: r dataframe vector multiplication


    【解决方案1】:

    使用tidyverse 方法

    加载库:

    library(tidyverse)
    

    执行乘法并仅选择您需要的三个变量:

    mydf_molt <- mydf %>% 
        mutate_at(.vars=c("ACB","ASW","BEB"),.funs=funs(.*EFF)) %>% 
        select(ACB,ASW,BEB)
    

    这是输出:

               ACB          ASW          BEB
    1 -0.003083562 -0.003156689 -0.001102814
    2  0.005349292  0.004209279  0.001441349
    3 -0.002849458 -0.002904664 -0.002819337
    4  0.002204625  0.002361238  0.001709012
    5 -0.003316615 -0.002562344 -0.003163756
    6 -0.003062250 -0.003078984 -0.002310535
    

    【讨论】:

      【解决方案2】:

      我们可以简单地做乘法

      matched_SNPs[2:4] * matched_SNPs[,5]
      #      ACB          ASW          BEB
      #1 -0.003083562 -0.003156689 -0.001102814
      #2  0.005349292  0.004209279  0.001441349
      #3 -0.002849458 -0.002904664 -0.002819337
      #4  0.002204625  0.002361238  0.001709012
      #5 -0.003316615 -0.002562344 -0.003163756
      #6 -0.003062250 -0.003078984 -0.002310535
      

      假设列是numeric

      如果不是numeric,而是factor,则先将感兴趣的列转换为numeric,然后进行乘法运算

      matched_SNPs[2:5] <- lapply(matched_SNPs[2:5], function(x) as.numeric(as.character(x)))
      

      【讨论】:

      • 这行得通,出于好奇,为什么我的代码行将它们转换为数字不起作用?
      • @Evan as.numeric/as.character 适用于矢量而不适用于 data.frame。这就是我们在每一列上循环的原因
      猜你喜欢
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      相关资源
      最近更新 更多