R:通过公共ID合并列,在任何行上都没有NA?

R:通过公共ID合并列,在任何行上都没有NA?,r,merge,imputation,R,Merge,Imputation,对于缺失值的数据,插补是一个用某些值替换缺失值的过程。目标是忽略缺少值的行(用NAs表示)。该行可被视为数据的一个组成部分,因此该过程称为项目插补 输入 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)) 输出 df1

对于缺失值的数据,插补是一个用某些值替换缺失值的过程。目标是忽略缺少值的行(用NAs表示)。该行可被视为数据的一个组成部分,因此该过程称为项目插补

输入

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))
输出

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))
预期结果是

ID V1   V2   V3
1  7    6    9
5  777  666  999
我们想要的是没有任何NA值的线条

如何将输入数据与V1、V2、V3列和一行中没有NA的公共列ID合并?
使用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'")

出于对这个问题中精心展示的俳句艺术形式的尊重,我将提供以下答案/猜测:

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,]
库(重塑)

dats这里是一个只支持基本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), ]
要读取中的数据,类似的方法应该可以工作

l <- lapply(list.files(pattern = glob2rx("data*.csv")), read.table, 
            header = TRUE)

l哇,这一定是我遇到的最糟糕的问题之一。ID=1的情况下是什么?你想告诉我们什么?您的可复制代码在哪里?我假定预期结果仅为预期结果的一行?
ID==1
发生了什么?
6
3
是否应在预期结果中,但在缺少数据的地方使用
NA
?代码很好,但不要指望我们能单独从中解读你的Q的意图@真的吗?根据什么规则应该排除ID 1,因为它与ID 5一样属于所有3个data.frames?是的,这样更好。请注意,您显示的数据不是CSV,我们不容易使用这些数据,因为它们不可复制或R代码/输出。tss tss。。。合并\递归?:哦,我喜欢!每天学习新东西。@hhh这解决了你的问题吗?我会检查自己,但如果没有可复制的例子,这是不可能的。我可以建议你读书吗?有了你的代表,我很惊讶这是必要的。
> 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)
l <- lapply(list.files(pattern = glob2rx("data*.csv")), read.csv)