首页 > 解决方案 > 如何引用满足某些条件的另一个值,然后可以在计算中使用

问题描述

我有两个数据框:

测试

Group.1   x
   1     25.5
   2     51
   3     51.5
   4     50
   5     51.5
   6     60 
   ...
   53    35.5

日历

Week   Hours  HourSpent
  1     8.5
  1     8.5
  1      0
  2     8.5
  2     8.5
  2     8.5
  2     8.5
  2     8.5
  2     6.5
  2     8.5
  3     7.0
  3     7.0
  3     8.2
  ...

我要做的是通过执行以下计算来填充日历 df 中的“HourSpent”列:(('Hours' / 'HourSpent') * 0.79)

我希望能够遍历日历 df 中的每一行,并将该行的“小时”值与匹配的“小时”值相除。'HoursSpent' 值可以从'Test' df 中确定......所以如果日历 df 中的 'Week' 列中的值与 'Test' df 的 'Group.1' 列中的任何值匹配,那么我想要'Test' df 的 'x' 列中的相应值是 'HourSpent' 值。

例如

日历 df 中的第 1 行将是8.5 / 25.5 * 0.79......这将适用于前 3 行,因为周数为 1。然后当我们到达第 4 行时,计算将变为8.5/ 51 * 0.79等等......等等

所需的输出 - 日历 df

Week   Hours  HourSpent
  1     8.5     0.2633
  1     8.5     0.2633
  1      0        0
  2     8.5     0.1317
  2     8.5     0.1317
  2     8.5     0.1317
  2     8.5     0.1317
  2     8.5     0.1317
  2     6.5     0.1007
  2     8.5     0.1317
  3     7.0     0.1074
  ...

代码尝试

for (i in 1:nrow(Calendar)){

 Calendar$'HourSpent' <- ifelse(Calendar$Week == Test$Group.1, 
 (Calendar$Hours/Test$x)*0.79, 
 0)

}

问题是这似乎只适用于一行,然后其他一切都是 0......这个问题有更好的解决方案吗?

非常感谢

标签: rdataframeif-statementmatch

解决方案


Test <- data.frame(`Group.1` = c(1, 2, 3, 4), x = c(25.5, 51, 51.5, 50))
Calendar <- data.frame(Week = c(1, 1, 1, 2, 2, 2, 3, 3, 3), Hours = c(8.5, 8.5, 0, 8.5, 8.5, 8.5, 8.5, 8.5, 8.5))
Calendar <- dplyr::inner_join(Calendar, Test, by = c("Week" = "Group.1")) %>% 
            dplyr::mutate(Hours_spent = (Hours/x)*0.79)

输出

日历

  Week Hours    x Hours_spent
1    1   8.5 25.5   0.2633333
2    1   8.5 25.5   0.2633333
3    1   0.0 25.5   0.0000000
4    2   8.5 51.0   0.1316667
5    2   8.5 51.0   0.1316667
6    2   8.5 51.0   0.1316667
7    3   8.5 51.5   0.1303883
8    3   8.5 51.5   0.1303883
9    3   8.5 51.5   0.1303883

推荐阅读