![](/img/trans.png)
[英]How do I create a vector of prime factors from a vector of all factors for a given number?
[英]Create a new vector from single vector by manipulating Factors
数据格式
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
循环执行此操作,该循环通过匹配日期来查找值。 只是想知道我是否有一种更容易错过的方式?
如果您的数据按日期和因子排序,则可以这样做。 使用逻辑向量选择“Value”的每个第二个元素,并计算比率
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), ]
当然还有其他方法,但我喜欢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))
或使用一些重型火炮( 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
你也可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.