r - 在dplyr中的列之间使用基本数学运算符

时间:2017-04-27 00:53:06

标签: r dplyr

我有一个包含汇率的数据框。我想将任何以" rate开头的列分开。"通过" rates.AUD"柱。

df <- structure(list(timestamp = c(1490659199L, 1490745599L, 1490831999L, 
1490918399L, 1491004766L, 1491091173L, 1491177598L, 1491263999L, 
1491350399L, 1491436799L), rates.USD = c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), rates.AUD = c(1.311019, 1.306745, 1.303737, 
1.306658, 1.31053, 1.31053, 1.310702, 1.314962, 1.321414, 1.321726
), rates.EUR = c(0.920726, 0.924523, 0.929473, 0.935651, 0.937734, 
0.937734, 0.937251, 0.937221, 0.936495, 0.937035)), .Names = c("timestamp", 
"rates.USD", "rates.AUD", "rates.EUR"), row.names = c(NA, 10L
), class = "data.frame")

我已尝试过以下

library(tidyverse)
result <- df %>% mutate_at(vars(starts_with("rates.")), funs(./rates.AUD))

但它没有将该功能应用于以&#34; rate开头的所有列。&#34;。 rate.USD和rates.AUD改变了,但是率.EUR保持不变。

我有点困惑,帮助赞赏。

2 个答案:

答案 0 :(得分:5)

我有同样的问题,无法弄明白,甚至将其作为问题发布在dplyr GH repo here上。响应非常有用,并且对您有用。问题的总结是,rate.AUD在你的data.frame中逐渐变为自我分割,并且在mutate除以rate之后.AUD本身就是在后续计算中使用该列(现在完全由1组成)。

Lionel Henry建议采用两种方法,我将为此示例更新。

result2 <- df %>%
  mutate_at(vars(starts_with("rates.")), function (x) x/df$rates.AUD)


result3 <- df %>% 
  mutate_at(vars(starts_with("rates.")),`/`, y = .$rates.AUD)

都返回:

    timestamp rates.USD rates.AUD rates.EUR
1  1490659199 0.7627655         1 0.7022980
2  1490745599 0.7652602         1 0.7075007
3  1490831999 0.7670259         1 0.7129298
4  1490918399 0.7653112         1 0.7160642
5  1491004766 0.7630501         1 0.7155380
6  1491091173 0.7630501         1 0.7155380
7  1491177598 0.7629499         1 0.7150756
8  1491263999 0.7604782         1 0.7127362
9  1491350399 0.7567651         1 0.7087067
10 1491436799 0.7565865         1 0.7089480

答案 1 :(得分:2)

按费率划分三个费率列时,按顺序划分它们。 rates.AUD除以其自身并等于1s,然后才能用于划分rate.EUR列。这样,rates.EUR除以1并保持不变。 解决方法是更改​​列顺序放置率.AUD作为最后一个: df = df[,c(1,2,4,3)] 在做计算之前。