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?
4 Réponses :
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
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
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')
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']
?
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))
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>