2014-07-09 69 views
3

數據格式通過操縱因素

Date   Factor Value 
2014-01-01  x  10 
2014-01-01  y  2 
2014-01-02  x  20 
2014-01-02  y  5 

我想返回一個載體,其是通過將值除以因子y的每一天爲因子x的值的結果創建從單個矢量的新載體。

看起來像結果:

Date   Value 
2014-01-01  5 
2014-01-02  4 

我目前做這與嵌套for循環,通過匹配的日期查找值。只是想知道是否有更簡單的方法,我失蹤了?

回答

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)) 
+0

謝謝。由於某種原因,它沒有抓取正確的值,但我使用的是數據框而不是表格,所以這可能就是問題所在。我要提交我的數據,看看是否能糾正它。再次感謝你! – camacnei

+0

不完全清楚你的意思 - 這個例子*使用數據框。 –

3

如果你的數據是按日期和因子排序,這是不行的。選擇「值」使用邏輯向量的每個第二元件,並且與所述日期

data.frame(Date = unique(df$Date), ratio) 
#   Date ratio 
# 1 2014-01-01  5 
# 2 2014-01-02  4 

如果需要一起計算在一個數據幀中的比率

ratio <- df$Value[c(TRUE, FALSE)]/df$Value[c(FALSE, TRUE)] 

穿戴比,由通過訂購數據開始日期和因子:

df <- df[order(df$Date, df$Factor), ] 
+1

有效,但有點太棘手/脆弱的我的口味。 –

+0

對不起,我使用了我的示例數據的一個壞例子。日期都是分散的,而不是那麼整齊。但是謝謝,我從你的帖子中學到了一些新東西! – camacnei

+0

沒問題。如果需要,我添加了一種方法來訂購數據。 – Henrik

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