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