我必须有两个数据框:
测试
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
...
我想做的是通过执行以下计算来填充Calendar df中的“ HourSpent”列: (('Hours' / 'HourSpent') * 0.79)
我希望能够遍历Calendar df中的每一行,并将该行的“小时”值与匹配的“小时花费”值相除。'HoursSpent'值可以从'Test'df决定...因此,如果Calendar df的'Week'列中的值与'Test'df的'Group.1'列中的任何值匹配,那么我要“测试” df的“ x”列中的对应值就是“小时花费”值。
例如
日历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 ...是否有更好的解决方案?
非常感谢
基本R
解决方案:
Test <- data.frame(Group.1 = 1:4, x = runif(4)*100, stringsAsFactors = FALSE)
Calendar <- data.frame(Week = sort(sample(1:4, 10, replace = TRUE)), Hours = runif(10)*100, HourSpent = NA, stringsAsFactors = FALSE)
head(Test)
# Group.1 x
# 1 1 7.163006
# 2 2 55.743758
# 3 3 48.983705
# 4 4 49.429236
head(Calendar)
# Week Hours HourSpent
# 1 1 41.22831 NA
# 2 1 68.30103 NA
# 3 1 65.34278 NA
# 4 2 91.59863 NA
# 5 2 81.31131 NA
# 6 2 67.58900 NA
names(Test)[which(names(Test) == "Group.1")] <- "Week"
Calendar <- merge(Calendar, Test, by = "Week", all.x = TRUE)
Calendar$HourSpent <- ((Calendar$Hours/Calendar$x) * 0.79)
head(Calendar)
# Week Hours HourSpent x
# 1 1 41.22831 4.5470251 7.163006
# 2 1 68.30103 7.5328452 7.163006
# 3 1 65.34278 7.2065835 7.163006
# 4 2 91.59863 1.2981349 55.743758
# 5 2 81.31131 1.1523431 55.743758
# 6 2 67.58900 0.9578707 55.743758
我想
我想做的是通过执行以下计算来填充Calendar df中的“ HourSpent”列:(('Hours'/'HourSpent')* 0.79)
有错字吗?因为那需要解决某种形式的东西Hours - HourSpent^2 = 0
。
编辑:
而且,使用a并没有错for loop
(特别是如果您是初学者;但这在大型数据集上可能会很慢)。因此,for loop
如果我们正确充实其逻辑,这就是您的样子:
for(i in 1:nrow(Calendar)){
for(j in 1:nrow(Test)){
if(Calendar$Week[i] == Test$Group.1[j] & is.na(Calendar$HourSpent[i])){
Calendar$HourSpent[i] <- ((Calendar$Hours[i]/Test$x[j]) * 0.79)
}
}
}
(基本思想:如果Week
值和Group.1
值相等/相同,并且HourSpent
尚未填写相应的列,则计算HourSpent
。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句