Использование коэффициентов (наклон и перехват) из одного фрейма данных для расчета списка значений из второго фрейма данных - PullRequest
1 голос
/ 03 мая 2020

У меня есть список длин (n = 30) для нескольких видов, назовем их A1, A2, A3, A4, A5:

A1<-(sample(x = 0:100, size  = 30, replace=TRUE))
A2<-(sample(x = 0:100, size  = 30, replace=TRUE))
A3<-(sample(x = 0:100, size  = 30, replace=TRUE))
A4<-(sample(x = 0:100, size  = 30, replace=TRUE))
A5<-(sample(x = 0:100, size  = 30, replace=TRUE))

df<-data.frame(A1,A2,A3,A4,A5)

Для Каждую из этих длин для каждого вида я хотел бы использовать с указанием вида c наклона и точки пересечения (y = mx + b) для расчета веса:

sample <- c("A1", "A2", "A3", "A4", "A5")
intercept <- rnorm(5, mean = 10, sd = 1)
slope <- rnorm(5, mean = 10, sd = 1)
upper <- rnorm(5, mean = 10, sd = 1) + rnorm(5, mean = 0.01, sd = 1)
lower <- rnorm(5, mean = 10, sd = 1) + rnorm(5, mean = 0.01, sd = 1)

coef<-data.frame(sample, intercept, slope, upper, lower)

где верхний и нижний 95 % доверительных интервалов.

Мой вопрос заключается в том, как рассчитать вес по видам для каждой строки столбца (df) для каждого вида (т.е. для каждого значения длины) -specifi c y = наклон * x + значения перехвата в кадре данных coef?

Я попытался создать дополнительные столбцы (например, A1.intercept, A1.slope, A1.upper, A1.lower) для каждого вида, а затем повторил одно и то же значение из (coef) по строкам, но 1) Я не могу заставить код работать должным образом, и 2) у меня много разновидностей (A1 - A70), поэтому код мучительно длинный.

Я пробовал разные варианты grep, но я выхожу пустым. Любая помощь очень благодарна!

Ответы [ 2 ]

1 голос
/ 03 мая 2020
library(dplyr)
set.seed(1) # reproducible data set
A1<-(sample(x = 0:100, size  = 30, replace=TRUE))
A2<-(sample(x = 0:100, size  = 30, replace=TRUE))
A3<-(sample(x = 0:100, size  = 30, replace=TRUE))
A4<-(sample(x = 0:100, size  = 30, replace=TRUE))
A5<-(sample(x = 0:100, size  = 30, replace=TRUE))

df<-data.frame(A1,A2,A3,A4,A5)

sample <- c("A1", "A2", "A3", "A4", "A5")
intercept <- rnorm(5, mean = 10, sd = 1)
slope <- rnorm(5, mean = 10, sd = 1)
upper <- rnorm(5, mean = 10, sd = 1) + rnorm(5, mean = 0.01, sd = 1)
lower <- rnorm(5, mean = 10, sd = 1) + rnorm(5, mean = 0.01, sd = 1)

coef <- data.frame(sample, intercept, slope, upper, lower)

If I have understood your question this may help you
df %>% 
tidyr::gather(sample,x) %>% # get df in long format
left_join(.,coef,"sample") %>% # join data
mutate(y = slope * x + intercept) # apply equation
1 голос
/ 03 мая 2020

В базе R вы можете сначала создать матрицу перехвата, где вы повторяете перехваты для количества наблюдений:

b = t(replicate(nrow(df),coef$slope[match(colnames(df),coef$sample)]))

Затем вы умножаете каждую строку на соответствующий наклон:

mx = sweep(df,2,coef$slope[match(colnames(df),coef$sample)],"*")

Вам нужно:

y = mx+b

Вы также можете объединиться с помощью dplyr (я думаю, это не так уж плохо, так как у вас мало):

library(dplyr)
library(tidyr)
df %>% tibble::rownames_to_column("id")  %>% 
pivot_longer(-id,names_to="sample") %>% 
left_join(coef)  %>% 
mutate(y=intercept+value*slope)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...