我有两个数据框:
> test
par1 par2 par3 progress
1 TRUE TRUE FALSE 0
2 TRUE FALSE TRUE 0
3 TRUE TRUE TRUE 0
4 TRUE TRUE TRUE 0
5 TRUE FALSE FALSE 0
6 FALSE FALSE TRUE 0
7 TRUE FALSE TRUE 0
8 TRUE TRUE TRUE 0
9 TRUE FALSE TRUE 0
10 TRUE FALSE TRUE 0
...
> rules
par1 par2 par3 progress
1 TRUE TRUE TRUE 0.1
2 TRUE TRUE FALSE 0.3
3 TRUE FALSE TRUE -0.2
4 TRUE FALSE FALSE 0.7
...
我想根据test$progress <- test$progress + rules$progress
,par1
和par2
的值修改par3
,即如果test[1, ]
,其进度应增加0.3
,如果test[2, ]
,其进度应减少0.2
,依此类推。在对test$progress
par1
进行适当更改后,将重新计算par2
和par3
值,并且该过程将重复多次。
数据框test
的行数约为4k,数据框rules
的参数的所有组合均为TRUE/FALSE
。
我知道如何在循环中执行此操作,但我知道这不是最好的方法。什么是更好的方法?
答案 0 :(得分:1)
然后你可以merge
前三列的两个表:
df <- merge(test, rules, all.x = TRUE, by = c("par1", "par2", "par3"))
df[,5][is.na(df[,5])] <- 0
df$progress = df$progress.x + df$progress.y
df <- df[c(1:3,6)]
df
par1 par2 par3 progress
1 FALSE FALSE TRUE 0.0
2 TRUE FALSE FALSE 0.7
3 TRUE FALSE TRUE -0.2
4 TRUE FALSE TRUE -0.2
5 TRUE FALSE TRUE -0.2
6 TRUE FALSE TRUE -0.2
7 TRUE TRUE FALSE 0.3
8 TRUE TRUE TRUE 0.1
9 TRUE TRUE TRUE 0.1
10 TRUE TRUE TRUE 0.1
注意新订单。
或dplyr
left_join(test, rules, by = c("par1", "par2", "par3")) %>%
replace(is.na(.), 0) %>% mutate(progress = progress.x + progress.y) %>% select(-c(4:5))
par1 par2 par3 progress
1 TRUE TRUE FALSE 0.3
2 TRUE FALSE TRUE -0.2
3 TRUE TRUE TRUE 0.1
4 TRUE TRUE TRUE 0.1
5 TRUE FALSE FALSE 0.7
6 FALSE FALSE TRUE 0.0
7 TRUE FALSE TRUE -0.2
8 TRUE TRUE TRUE 0.1
9 TRUE FALSE TRUE -0.2
10 TRUE FALSE TRUE -0.2