我有一个类似于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>特别>空白功能。
由于 迪西
答案 0 :(得分:1)
如果您将数据读入R data.frame
说DF
。然后,您可以先将Var1
和Var2
的值重置为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