相对于R中的另一个数据帧修改数据帧

时间:2015-11-04 19:03:13

标签: r dataframe

我有两个数据框:

> 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$progresspar1par2的值修改par3,即如果test[1, ],其进度应增加0.3,如果test[2, ],其进度应减少0.2,依此类推。在对test$progress par1进行适当更改后,将重新计算par2par3值,并且该过程将重复多次。

数据框test的行数约为4k,数据框rules的参数的所有组合均为TRUE/FALSE

我知道如何在循环中执行此操作,但我知道这不是最好的方法。什么是更好的方法?

1 个答案:

答案 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