通过操纵因子从单个向量创建新向量

时间:2014-07-09 21:39:28

标签: 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循环执行此操作,该循环通过匹配日期来查找值。只是想知道我是否有一种更容易错过的方式?

4 个答案:

答案 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