Вычисление таблицы в R с неравномерной длиной

#r

#r

Вопрос:

У меня есть таблица данных в R

 a =   Duration (-10,0] (0,0.25] (0.25,0.5] (0.5,10]
1        2       0        0          0        2
2        3       0        0         10        3
3        4       0       51         25        0
4        5      19      129         14        0
5        6      60      137          1        0
6        7      31       62         15        5
7        8       7       11          7        0
  

и

 b =   Duration (-10,0] (0,0.25] (0.25,0.5] (0.5,10]
1        1       0        0          1      266
2        2       1        0         47      335
3        3       1       26        415      142
4        4       3      965        508        5
5        5     145     2535        103        0
6        6     939     2239         15        6
7        7     420      613         86       34
8        8      46       84         36       16
  

Я хотел бы рассчитать b / a, сопоставив длительность. Я думал о чем-то вроде ifelse(), но это не работает. Может кто-нибудь мне помочь?
Большое спасибо

Комментарии:

1.Должен ли a merge by="Duration" работать для вас?

2. слияние — это когда вы хотите присоединиться к таблице данных, верно? или это также возможно для вычисления c<-b / a?

3. После merge с all = TRUE , затем выполните b/a . Кстати, для продолжительности, которой нет ни в одном из наборов данных, строки будут NA после слияния. Таким образом, она будет делиться на NA для этой строки.

4. после слияния я получаю одну большую таблицу из 15 строк. Я не уверен, как получить оттуда b / a

Ответ №1:

Сопоставьте порядок и выбор b с a (в моем примере y с x). Затем выполните вычисления.

 x <- data.frame(duration = 2:8, v = rnorm(7))

y <- data.frame(duration = 8:1, v = rnorm(8))
m <- match(y$duration, x$duration)

ym <- y[m[!is.na(m)],]

x$v/ym$v
  

Это не работает, когда x содержит элементы, которых нет в y, кстати.

Ответ №2:

Вы хотите что-то вроде следующего:

 a <- a[-1]
b <- b[-1]

a <- a[order(a$Duration),]
b <- b[order(b$Duration),]
durations <- intersect(a$Duration, b$Duration)
b[b$Duration %in% durations,] / a[a$Duration %in% durations,]

  Duration   (-10,0]  (0,0.25] (0.25,0.5]  (0.5,10]
2        1       Inf       NaN        Inf 167.50000
3        1       Inf       Inf  41.500000  47.33333
4        1       Inf 18.921569  20.320000       Inf
5        1  7.631579 19.651163   7.357143       NaN
6        1 15.650000 16.343066  15.000000       Inf
7        1 13.548387  9.887097   5.733333   6.80000
8        1  6.571429  7.636364   5.142857       Inf
  

возможно, вам захочется заменить значения NaN и Inf чем-то другим.