r - Realizar cálculos utilizando variables de 2 marcos de datos

CorePress2024-01-24  8

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    

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare