2013-11-03 23 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