У меня есть data.frame под названием "matched_SNPs" здесь:

  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.

Как я могу это исправить?

1
Evan 30 Дек 2017 в 21:09

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)))
1
akrun 30 Дек 2017 в 18:16

Использование подхода 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
Scipione Sarlo 30 Дек 2017 в 18:19