Умножение всего df или матрицы на 1000? - PullRequest
0 голосов
/ 23 октября 2019

Я новичок в R и Python, так что простите, если это элементарный вопрос. У меня есть большой набор данных генов (столбцов) по пациентам (строкам), причем каждое значение является значением экспрессии РНК (большинство значений находится в диапазоне от 0 до 1). Я хочу умножить весь набор данных на 1000, чтобы все ненулевые значения были> 1.

В настоящее время:

Pt GeneA GeneB GeneC
 1  0.001   2     0    
 2    0    0.5  0.002

Хотелось бы:

Pt GeneA GeneB GeneC
 1    1   2000   0    
 2    0   500    2

Я пытался сделать это как на R, так и на Python и столкнулся с проблемами с обоими. Я также попытался преобразовать мои данные между фреймом данных и матрицей, и это не будет работать ни с одним из них. Я много раз искал на этом сайте и нашел информацию о том, как умножить всю df / матрицу на вектор или отдельные столбцы на скаляр, но не на все. Может ли кто-нибудь любезно указать мне правильное направление? Я чувствую, что это не может быть так сложно:)

Использование R:

df <- read.csv("/Users/m/Desktop/data.csv")
df * 100
In Ops.factor(left, right) : ‘*’ not meaningful for factors
mtx <- as.matrix(df)
mtx * 100
Error in mtx * 100 : non-numeric argument to binary operator

Использование Python 3.7.6:

df = df * 1000

^ Это работает без сообщения об ошибке, но значения в ячейках совпадают, поэтомуна самом деле ничего не умножить ...

df = df.div(.001)
TypeError: unsupported operand type(s) for /: 'str' and 'float'

Какие-нибудь творческие идеи или ресурсы, чтобы указать мне правильное направление? Спасибо!

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

Глядя на целевой результат, вам нужно умножить все столбцы, кроме pt. В питоне:

target_cols = [i for i in df.columns if i!='Pt']
for i in target_cols:
  df[i] = df[i].astype(float)
  df[i] = df[i]*1000
0 голосов
/ 23 октября 2019

Что дает str(df)? По крайней мере, некоторые из ваших столбцов были преобразованы в факторы, потому что они являются символьными строками. Откройте файл csv в текстовом редакторе и убедитесь, что числа не заключены в "" или что пропущенные значения помечены символом. Как только вы прочитаете данные правильно, все будет просто:

set.seed(42)
dat <- data.frame(matrix(sample.int(100, 100, replace=TRUE), 10, 10))
str(dat)
# 'data.frame': 10 obs. of  10 variables:
#  $ X1 : int  49 65 25 74 100 18 49 47 24 71
#  $ X2 : int  100 89 37 20 26 3 41 89 27 36
#  $ X3 : int  95 5 84 34 92 3 58 97 42 24
#  $ X4 : int  30 43 15 22 58 8 36 68 86 18
#  $ X5 : int  92 69 4 98 50 99 88 87 49 26
#  $ X6 : int  6 6 2 3 21 2 58 10 40 5
#  $ X7 : int  33 49 100 73 29 76 84 9 35 93
#  $ X8 : int  16 92 69 92 2 82 24 18 69 55
#  $ X9 : int  40 21 100 57 100 42 18 91 13 53
#  $ X10: int  54 83 32 80 60 29 81 73 85 43
dat1000 <- dat * 1000
0 голосов
/ 23 октября 2019

Попробуйте эту опцию:

df[,c(2:ncol(df)] <- 1000*df[,c(2:ncol(df)]

Если вы вместо этого хотели использовать более общее решение, ориентированное только на столбцы, имя которых начинается с Gene, используйте:

df[grep("^Gene", names(df))] <- 1000*df[grep("^Gene", names(df))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...