R 通过操纵因子从单个向量创建新向量
数据格式R 通过操纵因子从单个向量创建新向量,r,R,数据格式 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循环执行此操作,该循环通过匹
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
循环执行此操作,该循环通过匹配日期来查找值。只是想知道是否有一个更简单的方式,我错过了 当然还有其他方法可以做到这一点,但我喜欢重塑2::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)
dd如果您的数据是按日期和因子排序的,这就可以了。使用逻辑向量选择“Value”的第二个元素,并计算比率
ratio <- df$Value[c(TRUE, FALSE)] / df$Value[c(FALSE, TRUE)]
如有必要,首先按日期和系数对数据进行排序:
df <- df[order(df$Date, df$Factor), ]
df或使用重炮(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
,使用公式
参数
使用@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
抱歉,我使用了一个错误的示例数据。这些日期都是零散的,没有那么整齐。但谢谢你,我从你的帖子中学到了一些新东西!没问题。我添加了一种订购数据的方法(如果需要)。谢谢。由于某种原因,它没有获取正确的值,但我使用的是数据帧而不是表,所以这可能就是问题所在。我将把我的数据整理成表格,看看是否正确。再次感谢你!不完全清楚您的意思--这个示例使用的是数据帧。
setDT(dd)[, Value[Factor == "x"]/Value[Factor == "y"], by = Date]
## Date V1
## 1: 2014-01-01 5
## 2: 2014-01-02 4
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