数据格式
Date Factor Value
2014-01-01 x 10
2014-01-01 y 2
2014-01-02 x 20
2014-01-02 y 5
我想返回一个向量,它是因子x
的值除以每个因子y
的值的结果。
结果如下:
Date Value
2014-01-01 5
2014-01-02 4
我目前正在使用嵌套的for
循环执行此操作,该循环通过匹配日期来查找值。只是想知道我是否有一种更容易错过的方式?
答案 0 :(得分:3)
如果您的数据按日期和因子排序,则可以这样做。使用逻辑向量选择“值”的每个第二个元素,并计算比率
ratio <- df$Value[c(TRUE, FALSE)] / df$Value[c(FALSE, TRUE)]
将数据框中的比率与日期
放在一起data.frame(Date = unique(df$Date), ratio)
# Date ratio
# 1 2014-01-01 5
# 2 2014-01-02 4
如有必要,首先按日期和因子排序数据:
df <- df[order(df$Date, df$Factor), ]
答案 1 :(得分:2)
当然还有其他方法,但我喜欢reshape2::dcast
。
创建示例:
dd <- read.table(text="
Date Factor Value
2014-01-01 x 10
2014-01-01 y 2
2014-01-02 x 20
2014-01-02 y 5",header=TRUE)
做到:
library(reshape2)
dd2 <- dcast(dd,Date~Factor)
with(dd2,data.frame(Date,Value=x/y))
答案 2 :(得分:2)
或使用一些重型火炮(data.table
)。如果dd
是您的数据集,请考虑:
library(data.table)
setDT(dd)[, Value[1]/Value[2], by = Date]
## Date V1
## 1: 2014-01-01 5
## 2: 2014-01-02 4
如果您的数据未订购,您可以先排序然后再运行:
setkey(setDT(dd), Date, Factor)[, Value[1]/Value[2], by = Date]
## Date V1
## 1: 2014-01-01 5
## 2: 2014-01-02 4
或者只是
setDT(dd)[, Value[Factor == "x"]/Value[Factor == "y"], by = Date]
## Date V1
## 1: 2014-01-01 5
## 2: 2014-01-02 4
答案 3 :(得分:1)
您还可以使用unstack
,使用formula
参数。
使用@ BenBolker的数据dd
,
data.frame(Date = unique(dd$Date), Value = with(unstack(dd, Value~Factor), x/y))
# Date Value
# 1 2014-01-01 5
# 2 2014-01-02 4