1
votes

Diviser une table avec une autre colonne en Python / R

J'ai une table dans un fichier texte, qui ressemble à ceci:

raise ValueError("Columns must be same length as key")

Pour générer cette table dans R:

import numpy as np
import pandas as pd
import codecs
doc = codecs.open('RawNumbers.txt')
df = pd.read_csv(doc, sep='\t')
col_division = [ 'V7',  'V8',  'V9']
df[col_division] = df[col_division] / df['COMMON']
col_division_two = [ 'V10',  'V11',  'V12']
df[col_division_two] = df[col_division_two] / df['SUBS']

quand je le lis avec R:

m = read.delim("RawNumbers.txt", header=F)
head(m)
      V4  V1   V2   V3 V5 V6  V7  V8  V9  V10  V11  V12   COMMON     SUBS
0  GENE1   1   37   40  .  -   7   9   1   15   14    8  567.400  145.000
1  GENE2   5   90   93  .  -  12  39   0   15   35    0  400.000   58.500
2  GENE3   6  278  281  .  +  22   0  12   10   30   18  100.344    0.009
3  GENE4   2  812  815  .  -   4   0   0    0    0    2   38.330    4.698

Je dois diviser chaque valeur dans la colonne V7 à V9 avec des valeurs dans COMMON code >, et de V10 à V12 avec des valeurs dans la colonne SUBS . Je fais cette division avec Python de la manière suivante:

 m <- data.frame("V4" = c("GENE1","GENE2","GENE3","GENE4"), "V1" = c(1,5,6,2), "V2" = c("37",90,278,812), "V3" = c(40,93,281,815), "V5"=c(".",".",".","."), "V6"=c("-","-","+","-"), "V7"=c(7,12,22,4), "V8"=c(9,39,0,0), "V9"=c(1,0,12,0), "V10" = c(15,15,10,0), "V11" = c(14,35,30,0), "V12"= c(8,0,18,2), "COMMON"=c(567.4,400,100.344,38.33), "SUBS"=c(145,58.5,0.009,4.698))

Cependant dans cette étape, je reçois une erreur de:

XXX

Comment puis-je corriger cette erreur, ou comment puis-je faire cette division en R au lieu de Python?


0 commentaires

4 Réponses :


3
votes

en R, cela devrait fonctionner:

m[,7:9] <- m[,7:9] / m[,13]
m[,10:12] <- m[,10:12] / m[,14]

Si vous connaissez la position de vos colonnes dans le dataframe, vous pouvez écrire:

m[,c("V7","V8","V9")] <- m[,c("V7","V8","V9")] / m$COMMON
m[,c("V10","V11","V12")] <- m[,c("V10","V11","V12")] / m$SUBS


3 commentaires

Merci pour votre réponse, j'ai ajouté l'exemple reproductible dans la question


Merci, ça marche! Serait-ce une façon dont je n'aurais pas besoin d'écrire le nom des colonnes individuellement mais de donner une plage?


Je vous en prie ! J'ai modifié ma réponse pour fournir un moyen de faire la division sans nommer les colonnes



2
votes

Pour Python, vous pouvez utiliser div et passer axis='rows':

col_division = [ 'V7',  'V8',  'V9']
df[col_division] = df[col_division].div(df['COMMON'], axis='rows')
col_division_two = [ 'V10',  'V11',  'V12']
df[col_division_two] = df[col_division_two].div(df['SUBS'], axis='rows')


2 commentaires

Merci, cette solution fonctionne bien! Serait-ce une façon dont je n'aurais pas besoin d'écrire le nom des colonnes individuellement mais de donner une plage?


df.loc [:, 'V7': 'V9'] ?



3
votes

Dans R, en utilisant dplyr , vous pouvez également utiliser mutate_at():

df1 <- read.table(header = T, text = "V4     V1  V2   V3   V5  V6  V7  V8  V9  V10  V11  V12  COMMON   SUBS
GENE1  1   37   40   .   -   7   9   1   15   14   8    567.4    145
GENE2  5   90   93   .   -   12  39  0   15   35   0    400.0    58.5
GENE3  6   278  281  .   +   22  0   12  10   30   18   100.344  0.009
GENE4  2   812  815  .   -   4   0   0   0    0    2    38.33    4.698")

Données :

library(dplyr)

df1 %>%
  mutate_at(vars(V7:V9), list(div = ~.x/COMMON)) %>%
  mutate_at(vars(V10:V12), list(div = ~.x/SUBS))


0 commentaires

2
votes

Avec base R , vous pouvez utiliser le code suivant pour le rendre

> m
     V4 V1  V2  V3 V5 V6         V7         V8          V9          V10          V11          V12  COMMON    SUBS
1 GENE1  1  37  40  .  - 0.01233698 0.01586183 0.001762425    0.1034483 9.655172e-02 5.517241e-02 567.400 145.000
2 GENE2  5  90  93  .  - 0.03000000 0.09750000 0.000000000    0.2564103 5.982906e-01 0.000000e+00 400.000  58.500
3 GENE3  6 278 281  .  + 0.21924579 0.00000000 0.119588615 1111.1111111 3.333333e+03 2.000000e+03 100.344   0.009
4 GENE4  2 812 815  .  - 0.10435690 0.00000000 0.000000000    0.0000000 0.000000e+00 4.257131e-01  38.330   4.698

tel que

m[c("V7","V8","V9","V10","V11","V12")] <- 
  m[c("V7","V8","V9","V10","V11","V12")]/data.frame(replicate(3,m$COMMON),replicate(3,m$SUBS))

p>


0 commentaires