2013-11-03 39 views
0

我有,看起來像下面在Excel 2007如何篩選R或Excel中的數據?

Class Var1 Var2 
1  20  27 
2    13 
2   
2  11 
2   
1  11  27 
2    61 
2   
2   
2   
1  20  27 
2  30  71 
2  
2  

數據包括所有類別= 2是個人屬於家庭(類= 1)正上方的一員。從5月例如,該數據屬於一個家庭

Class Var1 Var2 
1  20  27 
2    13 
2   
2  11 
2   

我想這樣做是刪除數據在個人層面,並與家庭層面的價值取代它。所以從我的例子中,輸出應該是,

Class Var1 Var2 
1  20  27 
2  20  27 
2  20  27 
2  20  27 
2  20  27 

有沒有一種簡單的方法在Excel或R中做到這一點?我有200k +行的數據,所以手動做到這一點將永遠佔據我的位置。

我不知道如何刪除個人級別的值。但一旦可以完成,我可以使用excels轉到> Special> Blanks函數。

感謝 迪西

回答

0

我在讀你的數據下 -

df <- read.table(textConnection(
"ClassObj Var1 Var2 
1  20  27 
2  NA  13 
2  NA NA 
2  11 NA 
2  NA NA 
1  11  27 
2  NA  71 
2  NA NA 
2  NA NA 
"), header = TRUE) 

然後如下處理它 -

library(data.table) 
dt <- data.table(df) 

#Flagging each group of 1 and successive 2s uniquely 
dt[,flag := 0] 
dt[ClassObj == 1,flag := 1] 
dt[,flag := cumsum(flag)] 

#Copying down the value of classobj = 1 to all other rows with the same flag 
dt[,Var1 := .SD[ClassObj == 1, Var1], by = "flag"] 
dt[,Var2 := .SD[ClassObj == 1, Var2], by = "flag"] 

爲了讓輸出 -

> dt 
    ClassObj Var1 Var2 flag 
1:  1 20 27 1 
2:  2 20 27 1 
3:  2 20 27 1 
4:  2 20 27 1 
5:  2 20 27 1 
6:  1 11 27 2 
7:  2 11 27 2 
8:  2 11 27 2 
9:  2 11 27 2 
+0

謝謝你這麼多Codoremifa!這節省了我大量的時間! ;-D – dixi

1

如果您將數據讀入R data.frameDF。然後,你可以重新設置的Var1值和Var2NA第一,然後使用na.locf函數從包zoo

DF 
## Class Var1 Var2 
## 1  1 20 27 
## 2  2 NA NA 
## 3  2 NA NA 
## 4  2 NA NA 
## 5  2 NA NA 
## 6  1 11 27 
## 7  2 NA NA 
## 8  2 NA NA 
## 9  2 NA NA 
## 10  2 NA NA 
## 11  1 20 27 
## 12  2 NA NA 
## 13  2 NA NA 
## 14  2 NA NA 

DF[DF$Class == 2, 2:3] <- NA 
require(zoo) 
DF <- na.locf(DF) 
DF 
## Class Var1 Var2 
## 1  1 20 27 
## 2  2 20 27 
## 3  2 20 27 
## 4  2 20 27 
## 5  2 20 27 
## 6  1 11 27 
## 7  2 11 27 
## 8  2 11 27 
## 9  2 11 27 
## 10  2 11 27 
## 11  1 20 27 
## 12  2 20 27 
## 13  2 20 27 
## 14  2 20 27 
+0

感謝這個geektrader!這也給了我一個想法: - D. – dixi