#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 чем-то другим.