Entrada de datos:
df1: df2:
t1 Value1 t2 Value2
2 10 1 24
3 124 2 32
4 88 3 207
4 50
5 144
Se debe utilizar la fórmula: Valor3 = Valor1*(t1-t2)/Valor2 (condición: t1>=t2)
Mi enfoque:
#Create a function using the given formula
function1 = function(x,y){
Value3 = x[,2] * (x[,1]-y[,1])/y[,2]
return(Value3)
}
#
if (df1$t1 >= df2$t2) {
lapply(list(df1, df2), FUN = function1)
}
#A new data frame df3 should be created including t1 & Value1 columns of df1 and new values calculated
Mi resultado esperado: por ejemplo, para t1=2, podemos hacer 2 cálculos usando t2=1, t2=2.
por ejemplo (en mi opinión),
t1 Value1 t2 Value 2 Value3
2 10 1 24 0.42
2 10 2 32 0
Para t1=3: 3 cálculos con t2 = 1,2,3 respectivamente y así sucesivamente.
Sin embargo, este código contiene errores (probablemente porque no es aplicable usar lapply en 2 marcos de datos diferentes en este caso). ¿Cómo puedo solucionar este problema?
Gracias de antemano.
¿Cuál es tu ex?resultado esperado?t1 y t2 no tienen la misma longitud.
- Paz Wang
27/03/2021 a las 9:45
Por ejemplo, para t1=2, podemos hacer 2 cálculos usando t2=1, t2=2. Para t1=3: 3 cálculos con t2 = 1,2,3 respectivamente y así sucesivamente. No sé si puedo crear otra columna en df1 o generar otro marco de datos.
- Jessie
27 de marzo de 2021 a las 9:55
Ya veoAhora, será mejor que muestres el resultado esperado en un marco de datos para que otros lo entiendan fácilmente.
- Paz Wang
27 de marzo de 2021 a las 9:58
Gracias por tu consejo, editaré mi publicación.
- Jessie
27/03/2021 a las 10:00
No, estos valores deben estar separados y no sumados, así que creo que un nuevo marco de datos podría funcionar mejor. Gracias @RonakShah.Acabo de agregarlo en mi publicación.
- Jessie
27/03/2021 a las 10:07
------------------------------------
¿Es este el resultado esperado?
Fusiono df1 y df2 como df para poder procesarlos fácilmente más adelante.
library(data.table)
df <- merge(df1,df2)
setDT(df)
df[,.SD[t1>=t2],by = t1][,.(Value3 = Value1*(t1-t2)/Value2)]
Resultado
Value3
1: 0.4166667
2: 0.0000000
3: 10.3333333
4: 3.8750000
5: 0.0000000
6: 11.0000000
7: 5.5000000
8: 0.4251208
9: 0.0000000
o
df[t1>=t2,.(Value3 = Value1*(t1-t2)/Value2), by = t1]
# t1 Value3
# 1: 2 0.4166667
# 2: 2 0.0000000
# 3: 3 10.3333333
# 4: 3 3.8750000
# 5: 3 0.0000000
# 6: 4 11.0000000
# 7: 4 5.5000000
# 8: 4 0.4251208
# 9: 4 0.0000000
Datos
df1 <- data.frame(
t1 = c(2,3,4),
Value1 = c(10,124,88)
)
df2 <- data.frame(
t2 = 1:5,
Value2 = c(24,32,207,50,144)
)
------------------------------------
Puedes probar este enfoque:
do.call(rbind, Map(function(x, y) {
val <- x >= df2$t2
tibble::tibble(t1 = x, Value1 = y, t2 = df2$t2[val],
Value2 = df2$Value2[val], Value3 = y * (x - t2)/Value2)
}, df1$t1, df1$Value1)) -> result
result
# t1 Value1 t2 Value2 Value3
# <int> <int> <int> <int> <dbl>
#1 2 10 1 24 0.417
#2 2 10 2 32 0
#3 3 124 1 24 10.3
#4 3 124 2 32 3.88
#5 3 124 3 207 0
#6 4 88 1 24 11
#7 4 88 2 32 5.5
#8 4 88 3 207 0.425
#9 4 88 4 50 0