【问题标题】:Comparing two data.frames and deleting rows based on NA values in one data.frame比较两个data.frames并根据一个data.frame中的NA值删除行
【发布时间】:2015-12-30 20:54:21
【问题描述】:

我有两个数据框。一个被认为是参考并具有每个值,另一个可能是也可能不是缺失值。我想比较两个数据帧,然后从参考数据帧中删除另一个具有 NA 的值。但是,数据框中可能包含缺失值的每一行都需要被视为单个比较,因此您正在为每一行开发唯一的引用。例如参考数据框(1):

  var1   var2   var3
1   a      b      c
2   q      w      e
3   z      x      n

另一个数据框(2):

   var1    var2    var3
1    p       o       i
2    u       y       t
3    NA      e       w
4    l       k       NA   

对于数据框 2 的第 1 行和第 2 行,我需要完整的参考,因为没有缺失值:

  var1   var2   var3
1   a      b      c
2   q      w      e
3   z      x      n

对于数据框 2 的第 3 行,我需要:

    var2   var3
1    b      c
2    w      e
3    x      n

对于数据框 2 的第 4 行,我需要:

  var1   var2   
1   a      b      
2   q      w      
3   z      x      

【问题讨论】:

  • 预期输出令人困惑。你能在改变后显示dataframe2吗
  • 数据框 2 永远不会改变。它用于根据数据框 1 的值定义新数据框的变量。
  • 如果您查看创建的最后 3 个数据帧的字母,您将看到它们的值来自数据帧 1。如果数据帧 2 中有 NA,则该变量将在新数据帧中删除删除了该变量的数据框 1 值。

标签: r


【解决方案1】:

试试:

> ref<-data.frame(var1=c('a','q','z'),var2=c('b','w','x'),var3=c('c','e','n'))
> new<-data.frame(var1=c('p','u',NA,'l'),var2=c('o','y','e','k'),var3=c('i','t','w',NA))
> apply(new,1,function(x) ref[,which(!is.na(x))] )
[[1]]
  var1 var2 var3
1    a    b    c
2    q    w    e
3    z    x    n

[[2]]
  var1 var2 var3
1    a    b    c
2    q    w    e
3    z    x    n

[[3]]
  var2 var3
1    b    c
2    w    e
3    x    n

[[4]]
  var1 var2
1    a    b
2    q    w
3    z    x

根据作者评论中的要求,如果他也想:

"如果 NA 在奇数索引,则删除 +1 索引,如果 NA 在偶数索引,则删除 -1 索引"。

is.odd <- function(x) x %% 2 == 1
apply(new, 1, function(x) {
    toremove <-which(is.na(x))
    toremove1<-sapply(toremove,function(x) ifelse(is.odd(x),x+1,x-1) )
    ref[,!(1:ncol(ref) %in% c(toremove,toremove1)),drop=F]
})

【讨论】:

  • 那行得通。不过,我还有一个曲线球。如果对于新的数据帧,每个变量都与它旁边的变量相关联怎么办。例如,如果 var 1 具有 NA 值,则删除 var 1 和 var 2。如果 var 3 具有 NA 值,则删除 var 3 和 var 4,依此类推。每两个变量都关联。
  • 然后使用:apply(new,1,function(x) {toremove=c(which(is.na(x)),which(is.na(x))+1); ref[,!(1:ncol(ref) %in% toremove),drop=F] })
  • 所以我稍微修改了你的代码,但我遇到了障碍。如果 NA 处于奇数索引,我将尝试删除 +1 索引,如果 NA 处于偶数索引,则删除 -1 索引。我认为我的代码有效,这只是没有 TRUE/FALSE 返回的问题。想看看吗? is.odd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多