0

我在 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+ 行数据,所以手动操作会花费我很长时间。

我不确定如何删除个人级别的值。但是一旦可以做到这一点,我就可以使用 excel 转到 > 特殊 > 空白函数。

谢谢迪西

4

2 回答 2

1

如果您将数据读入 R 中,请data.frameDF. 然后你可以只重置和的值,然后Var1首先使用包中的函数Var2NAna.locfzoo

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
于 2013-11-03T11:34:14.400 回答
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
于 2013-11-03T11:17:20.610 回答