【问题标题】:R: Is there any way to send down all the NAs from each column in a dataframe?R:有没有办法从数据帧的每一列中发送所有的 NA?
【发布时间】:2021-08-22 11:11:51
【问题描述】:

给定如下数据框:

farm_1       farm_2        farm_3
NA           chicken       NA
cow          lamb          NA
NA           NA            deer
lamb         pig           pig
NA           donkey        NA

我想重塑它,使每列包含的所有 NA 都转到较低的位置,而将较高的位置留给实际值。因此,示例中的数据框应该是这样的:

farm_1       farm_2        farm_3
cow          chicken       deer
lamb         lamb          pig
NA           pig           NA
NA           donkey        NA
NA           NA            NA

【问题讨论】:

  • 但这会改变你的行吗?

标签: r dplyr tidyr data-wrangling


【解决方案1】:

因为它有什么好处。实现所需结果的 tidyverse 方法可能如下所示:

d <- read.table(text = "farm_1       farm_2        farm_3
NA           chicken       NA
cow          lamb          NA
NA           NA            deer
lamb         pig           pig
NA           donkey        NA", header = TRUE)

library(dplyr)

mutate(d, across(everything(), sort, na.last = TRUE))
#>   farm_1  farm_2 farm_3
#> 1    cow chicken   deer
#> 2   lamb  donkey    pig
#> 3   <NA>    lamb   <NA>
#> 4   <NA>     pig   <NA>
#> 5   <NA>    <NA>   <NA>

如果您想保留非 NA 值的顺序(感谢@Lucas 指出),您可以这样做:

mutate(d, across(everything(), ~ sort(forcats::fct_inorder(.x), na.last = TRUE)))
#>   farm_1  farm_2 farm_3
#> 1    cow chicken   deer
#> 2   lamb    lamb    pig
#> 3   <NA>     pig   <NA>
#> 4   <NA>  donkey   <NA>
#> 5   <NA>    <NA>   <NA>

【讨论】:

  • 但这是错误的排序方式!结果不一样……
  • @Lucas 感谢您指出这一点。刚刚添加了一个编辑。
【解决方案2】:

您可以使用na.omit 删除NA 值,对值进行子集化,以便最后一个值附加NA

df[] <- lapply(df, function(x) na.omit(x)[1:length(x)])

#  farm_1  farm_2 farm_3
#1    cow chicken   deer
#2   lamb    lamb    pig
#3   <NA>     pig   <NA>
#4   <NA>  donkey   <NA>
#5   <NA>    <NA>   <NA>

或者如果你更喜欢dplyr -

library(dplyr)
df %>% mutate(across(.fns = ~na.omit(.)[1:length(.)]))

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 2020-06-11
    • 2016-12-26
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    相关资源
    最近更新 更多