如何过滤R或excel中的数据?

时间:2013-11-03 10:55:46

标签: r excel filter

我有一个类似于excel 2007中的数据。

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       

所有Class = 2都是直接位于其上方的家庭成员(Class = 1)。从可能的例子来看,这个数据属于一个家庭

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 Go to>特别>空白功能。

由于 迪西

2 个答案:

答案 0 :(得分:1)

如果您将数据读入R data.frameDF。然后,您可以先将Var1Var2的值重置为NA,然后再使用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

答案 1 :(得分: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