【问题标题】:How to shift single NA to bottom of column in R如何将单个NA移动到R中的列底部
【发布时间】:2017-08-28 13:18:09
【问题描述】:

我有以下数据框:

example=data.frame(x=c(1,2,3),y=c(4,5,6))


     x     y
1    1     4
2    2     5
3    3     6

我想从 1 列中删除一个值,所以我得到了这个(我使用 example$x[example$x==2]<-NA 实现的):

     x     y
1    1     4
2    NA    5
3    3     6

但现在我被卡住了,因为我现在想将剩余的值向上移动,以便 NA 位于底部:

     x     y
1    1     4
2    3     5
3    NA    6

最终我希望能够对两列都执行此操作,在不同的行中使用单个值,例如:

来自:

     x     y
1    1     NA
2    NA    5
3    3     6

收件人:

     x     y
1    1     5
2    3     6
3    NA    NA

希望有人有一个简单的解决方案!谢谢

【问题讨论】:

  • 这样做的理由是什么?据推测,数据框旨在将一行中的值相互关联。通过这样做,您将x = 1y = 4 相关的关系更改为x = 1y = 5 相关的关系。
  • 我的数据框是 x= 女性 ID 和 y= 男性 ID。我需要根据他们的相关性将女性与男性相匹配,这对于每对可能的夫妇都是不同的)。一旦选择了女性,我需要从列中删除该个人,并且所有剩余的 ID 都会向上移动,这样就不会出现空白。我希望有一个简单的解决方案,但我可能需要重新评估如何使用这些值。可能不是作为一个数据帧,而是作为单独的。
  • 好消息是,您的问题在您提供的上下文中是有意义的。更好的消息是 R 可能有更好的方法来进行匹配。该方法将在一定程度上取决于您的匹配标准是什么。然而,这可能是与这个问题不同的一个问题。
  • 很高兴听到这个消息!这件作品只是一个大循环的一小部分,它从谱系中对个体进行子集和选择进行育种。我对这种编码很陌生,所以这是我思考它如何工作的最简单方法。感谢您的意见!
  • 你可以看看Matching 包。它可能允许您根据您使用的标准自动执行此过程。它主要使用指标(距离),这需要非分类变量,但您可以指定分类变量的精确匹配。

标签: r dataframe na


【解决方案1】:

这是一种使用is.na 和子集[ 的方法。从这个数据集开始。

example=data.frame(x=c(1,NA,3),y=c(NA,5,6))
example
   x  y
1  1 NA
2 NA  5
3  3  6

您使用lapply 遍历每个变量并获取未丢失的变量,并在最后附加这些缺失值。然后使用 example[] <- 将此结果反馈回原始数据集,该数据集维护 data.frame 结构。

example[] <- lapply(example, function(x) c(x[!is.na(x)], x[is.na(x)]))
example
   x  y
1  1  5
2  3  6
3 NA NA

我们也可以像这样使用更新的 (R 3.3.3) grouping 函数

example[] <- lapply(example, function(x) x[grouping(is.na(x))])

order

example[] <- lapply(example, function(x) x[order(is.na(x))])

在最后两个中,关键是在is.na 上排序,而不是元素本身。这样您就可以保留非空元素的原始顺序。

【讨论】:

  • 帖子的作者提到他想移动元素,而不是排序!
  • @DamianoFantini 是谁? ;-)
  • 哈哈,确实是她,但不用担心 :) 这非常有效,谢谢!
【解决方案2】:

我们也可以使用tidyverse

library(dplyr)
example %>% 
   mutate_all(funs(.[order(is.na(.))]))
#   x  y
#1  1  5
#2  3  6
#3 NA NA

如果列需要依赖

example %>% 
        arrange_all(funs(is.na(.)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多