2013-01-05 51 views
0

我有一個excel數據集,我想加載到R中。數據集有兩個變量「weight」和「height」,其中每個變量都有自己的日期指定時間被記錄。高度變量具有跳過/缺失值,同樣在重量變量中,如果數據足夠遠的話。我試圖創建一個合併的數據集,其中重量和高度根據日期在適當的地方合併和排列,並且在不存在值時放置NA。有沒有可以幫助我做到的命令/功能?謝謝!對齊R中的分解數據

obs  date weight  date height 
    1 2010-10-04 52495 2010-10-04 11.6 
    2 2010-10-01 53000 2010-10-01 15.3 
    3 2010-09-30 52916 2010-09-30 14.3 
    4 2010-09-29 52785 2010-09-29 11.3 
    5 2010-09-28 53348 2010-09-28 18.2 
    6 2010-09-27 52885 2010-09-24 11.7 
    7 2010-09-24 52174 2010-09-23 15.0 
    8 2010-09-23 51461 2010-09-22 18.6 
    9 2010-09-22 51286 2010-09-20 17.9 
    10 2010-09-21 50968 
    11 2010-09-20 49250 
+1

將這些數據加載爲兩個數據幀是否方便?這會讓事情變得更容易。 –

+0

如果這是從已讀入read.table的R對象中提出的,則不會有重複的列名稱。 @gabriel:請學習發佈'dput(r_object)'的輸出。 –

回答

1
d <- read.table(header=FALSE, fill=TRUE, text="1 2010-10-04 52495 2010-10-04 11.6 
    2 2010-10-01 53000 2010-10-01 15.3 
    3 2010-09-30 52916 2010-09-30 14.3 
    4 2010-09-29 52785 2010-09-29 11.3 
    5 2010-09-28 53348 2010-09-28 18.2 
    6 2010-09-27 52885 2010-09-24 11.7 
    7 2010-09-24 52174 2010-09-23 15.0 
    8 2010-09-23 51461 2010-09-22 18.6 
    9 2010-09-22 51286 2010-09-20 17.9 
    10 2010-09-21 50968 
    11 2010-09-20 49250 ") 

d1 <- d[2:3] 
d2 <- d[!is.na(d[,5]),][4:5] 

names(d1) <- c('Date', 'val1') 
names(d2) <- c('Date', 'val2') 
m <- merge(d1, d2, by='Date', all=TRUE) 

> m 

##   Date val1 val2 
## 1 2010-09-20 49250 17.9 
## 2 2010-09-21 50968 NA 
## 3 2010-09-22 51286 18.6 
## 4 2010-09-23 51461 15.0 
## 5 2010-09-24 52174 11.7 
## 6 2010-09-27 52885 NA 
## 7 2010-09-28 53348 18.2 
## 8 2010-09-29 52785 11.3 
## 9 2010-09-30 52916 14.3 
## 10 2010-10-01 53000 15.3 
## 11 2010-10-04 52495 11.6 
2

我假設這個問題是不是將數據讀入R,但它處理它已經被讀取之後。不過,在讀取數據時,您可以使用參數check.names = FALSEfill = TRUE,以允許您使用Reduce合併數據。

首先進行模擬讀取數據。

temp <- read.table(header = TRUE, 
text = "obs date weight date height 
1 2010-10-04 52495 2010-10-04 11.6 
2 2010-10-01 53000 2010-10-01 15.3 
3 2010-09-30 52916 2010-09-30 14.3 
4 2010-09-29 52785 2010-09-29 11.3 
5 2010-09-28 53348 2010-09-28 18.2 
6 2010-09-27 52885 2010-09-24 11.7 
7 2010-09-24 52174 2010-09-23 15.0 
8 2010-09-23 51461 2010-09-22 18.6 
9 2010-09-22 51286 2010-09-20 17.9 
10 2010-09-21 50968 
11 2010-09-20 49250 
", fill = TRUE, check.names = FALSE) 

二,使用Reduce()merge()

Reduce(function(x, y) merge(x, y, all.x = TRUE), 
     list(temp[2:3], temp[4:5])) 
#   date weight height 
# 1 2010-09-20 49250 17.9 
# 2 2010-09-21 50968  NA 
# 3 2010-09-22 51286 18.6 
# 4 2010-09-23 51461 15.0 
# 5 2010-09-24 52174 11.7 
# 6 2010-09-27 52885  NA 
# 7 2010-09-28 53348 18.2 
# 8 2010-09-29 52785 11.3 
# 9 2010-09-30 52916 14.3 
# 10 2010-10-01 53000 15.3 
# 11 2010-10-04 52495 11.6 
+1

'Reduce'似乎在這裏過度殺傷:'merge(temp [2:3],temp [4:5],all.x = TRUE)'。但也許有兩對以上的列。 –

+1

@MatthewLundberg,是的,你是完全正確的。對於這個特定的例子來說,這是過分的。我正在考慮更多專欄,但重新閱讀這個問題,我懷疑它! – A5C1D2H2I1M1N2O1R2T1