рассчитать разницу между последовательным числом и использовать для вывода на другой кадр данных в R - PullRequest
3 голосов
/ 20 февраля 2012

У меня следующий набор данных

mark <- c("0", "A", "B", "C", "D", "E")
phy <- c(0, 1, 10, 15, 18, 20)
gen <- c(0, 3, 35.0, 55, 60, 65)
mydata <- data.frame (mark, phy, gen)

  mark phy gen
1    0   0   0
2    A   1   3
3    B  10  35
4    C  15  55
5    D  18  60
6    E  20  65

Я хочу вычесть последовательные числа в phy и gen (1 из 2, 2 из 3 и т. Д. До конца) и рассчитать соотношение, например дляпервый случай

(phy[2] - phy[1]) / (gen[2] - gen[1])

аналогично для второго случая будет

(phy[3] - phy[2]) / (gen[3] - gen[2])

и так далее.

Таким образом, результат будет

phydis <- phy[i+1] - phy[i], where i is 1:6 (end of the data frame)

ratio <- (phy[i+1] - phy[i]) / (gen[i+1] - gen[i])

мои ручные вычисления:

phydis <- c(1, 9, 5, 3, 2)
disg <- c(3, 32, 20, 5, 5)
ratio <- phydis / disg
 ratio
[1] 0.3333333 0.2812500 0.2500000 0.6000000 0.4000000

Отношение - это коэффициент преобразования для второго набора данных.Если что-либо между двумя значениями phy в указанном выше наборе данных будет умножено на соответствующее соотношение.

Мой второй набор данных:

mark <- c("i", "k", "l", "m", "n", "o", "p")
phy <- c(3, 11, 12, 15, 17,18, 20)
mydf2 <- data.frame(mark, phy)
  mark phy
1    i   3
2    k  11
3    l  12
4    m  15
5    n  17
6    o  18
7    p  20

Как отметка i попадает между mydata $ phy 1-10, будетумноженное на коэффициент 0,2812500, аналогичным образом значение k phy, попадающее между mydata $ phy 10-15, будет умножено на коэффициент 0,2500000.Таким образом, полная математика:

  mark phy  gen
1    i   3   3 * 0.2812500
2    k  11   11* 0.2500000
3    l  12   12 * 0.2500000
4    m  15   15 * 0.2500000
5    n  17   17 * 0.6000000
6    o  18   18 * 0.6000000
7    p  20   20 * 0.4000000

В отличие от набора данных, представленного здесь, у меня есть большой набор данных для работы.

Правки:

Позвольте мне прояснить в отношении второй части:

на основе первой части мы рассчитали соотношение между интервалами -

0 - 1,        1-10,      10-15,      15-18,    18-20 
0.3333333    0.2812500   0.2500000  0.6000000  0.4000000

ТеперьФактор продукта будет зависеть от того, где значение mydf2 $ phy попадает в эти интервалы.Например, первое значение mydf2 $ phy = 3, которое падает между 1-10, таким образом, будет умножено на 0.2812500, второе значение равно 11, которое находится между 10-15, таким образом, будет умножено на 0.2500000 и так далее.

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Расширяя ответ Дэйсона:

mark <- c("0", "A", "B", "C", "D", "E")
phy <- c(0, 1, 10, 15, 18, 20)
gen <- c(0, 3, 35.0, 55, 60, 65)
mydata <- data.frame (mark, phy, gen)

ratio <- diff(mydata$phy)/diff(mydata$gen)

mark <- c("i", "k", "l", "m", "n", "o", "p")
phy <- c(3, 11, 12, 15, 17,18, 20)
mydf2 <- data.frame(mark, phy)

mydf2$cat.phy <- cut(mydf2$phy, mydata$phy)
key <- data.frame(cat=levels(cut(mydf2$phy, mydata$phy)), ratio=ratio)
mydf2$gen <- mydf2$phy * key[match(mydf2$cat.phy, key$cat), 'ratio']

mydf2

Выход:

> mydf2
  mark phy cat.phy      gen
1    i   3  (1,10]  0.84375
2    k  11 (10,15]  2.75000
3    l  12 (10,15]  3.00000
4    m  15 (10,15]  3.75000
5    n  17 (15,18] 10.20000
6    o  18 (15,18] 10.80000
7    p  20 (18,20]  8.00000
2 голосов
/ 20 февраля 2012

Это мог бы решить ваш первый вопрос:

# diff gives the successive differences
ratio <- diff(phy)/diff(gen)

и мне непонятно, как вы умножаете числа на ваши вторые вопросы.

...