给定具有缺失值的数据,插补是将缺失值替换为某些值的过程。目标是忽略具有缺失值的行,用NA表示。这样的行可以看作是数据的一个组成部分,因此该过程称为项目插补。
输入
df1 <- data.frame(ID=c(1,2,5,6),V1=c(7,77,777,NA))
df2 <- data.frame(ID=c(1,3,5,6),V2=c(6,66,666,6666))
df3 <- data.frame(ID=c(1,3,5,6),V3=c(9,NA,999,9999))
或者以CSV格式,其中错误值用NA标记
data.csv data2.csv data3.csv
ID V1 ID V2 ID V3
1 7 1 6 1 9
2 77 2 NA 2 NA
3 NA 3 66 3 NA
4 NA 4 NA 4 NA
5 777 5 666 5 999
6 NA 6 6666 6 9999
输出
预期结果是
ID V1 V2 V3
1 7 6 9
5 777 666 999
我们只想要没有任何NA值的行。
使用SQLDF合并具有公共ID且无NA的列的示例解决方案
library(sqldf)
# Read in the data: with CSV, you can use read.csv or fread from data.table
df1 <- data.frame(ID=c(1,2,5,6),V1=c(7,77,777,NA))
df2 <- data.frame(ID=c(1,3,5,6),V2=c(6,66,666,6666))
df3 <- data.frame(ID=c(1,3,5,6),V3=c(9,NA,999,9999))
#
sqldf("SELECT a.ID, a.V1, b.V2, c.V3 FROM df1 a, df2 b, df3 c WHERE a.ID=b.ID AND b.ID=c.ID AND V1!='NA'")
导致
ID V1 V2 V3
1 1 7 6 9
2 5 777 666 999
答案 0 :(得分:3)
这是一个基于R的唯一版本,它不关心有多少合并。假设数据帧在列表l
中 - 请参阅编辑Q以获取该格式的示例数据:
for(i in seq_along(l[-1])) {
if(i == 1) {
m <- merge(l[[i]], l[[i+1]])
} else {
m <- merge(m, l[[i+1]])
}
}
m <- m[!apply(is.na(m), 1, any), ]
给出了所需的输出
> m
ID V1 V2 V3
1 1 7 6 9
2 5 777 666 999
要读取数据,这样的事情应该起作用
l <- lapply(list.files(pattern = glob2rx("data*.csv")), read.table,
header = TRUE)
或者它们是否真的是CSV
l <- lapply(list.files(pattern = glob2rx("data*.csv")), read.csv)
然后您可以使用上面的代码来处理。
答案 1 :(得分:2)
出于对这个问题中精细展示的ha句艺术形式的尊重,我将提供以下答案/猜测:
library(reshape)
dats <- lapply( dir(), read.csv )
mgd <- merge_recurse( dats, by="ID" )
na.sel <- apply( mgd, 1, function(x) any(is.na(x)) )
mgd <- mgd[!na.sel,]
请注意,这假设您确实需要ID == 1。
感谢@Joris提供的merge_recurse
小费。