Я думаю, что с data.frames проще работать, чем с матрицами.Мне нравится сохранять каждый этап проблемы в отдельном data.frame, чтобы при необходимости мне было легко проследить шаг, и я могу четко видеть, что было сделано каждым преобразованием.
Если мы начнем с некоторого примераданные (хотя обычно вы читаете это из файла, используя read.csv
или что-то подобное):
#get data as a data frame
df <- structure(list(v1 = c(68, 120), v2 = c(70, 121), v3 = c(71, 122), v4 = c(72, 123)), class = "data.frame", row.names = c("row1", "row2"))
df
v1 v2 v3 v4
row1 68 70 71 72
row2 120 121 122 123
Преобразовать в журнал (base10):
#take log (base 10) of data frame
df_log <- log10(df)
df_log
v1 v2 v3 v4
row1 1.832509 1.845098 1.851258 1.857332
row2 2.079181 2.082785 2.086360 2.089905
Последний шаг...
df_ans <- df_log[,] - df_log[,1]
, что означает, что из каждой строки и столбца нашего фрейма данных журнала df_log[,]
вычитайте значение из первого столбца df_log[,1]
и сохраняйте результаты в df_ans
.
Результат:
df_ans
v1 v2 v3 v4
row1 0 0.012589127 0.018749436 0.02482358
row2 0 0.003604124 0.007178585 0.01072387
Примечание: эта последняя операция должна выполняться с двумя разными фреймами данных df_ans
и df_log
.Если вы попытаетесь сделать все это на одном и том же data.frame, например, df_log <- df_log[,] - df_log[,1]
, он не будет работать, так как df_log[,1]
будет изменен на 0
в середине операции, а затем вы вычтете 0
из всех ячеек, которыене будет работать очень хорошо!