繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM