【问题标题】:How to delete a specific value based on the column before in R如何根据R中之前的列删除特定值
【发布时间】:2021-10-08 17:54:21
【问题描述】:

我在 R 中有一个包含变量列表的数据框。但是,我已经打印了我感兴趣的最后两列。我只想在 bs_Scores == 时删除 value 列中所有出现的 NAs bs_24.

bs_Scores   value
bs_0    16.7
bs_1    41.7
bs_12   33.3
bs_24   NA
bs_0    25
bs_1    41.7
bs_12   NA
bs_24   0
bs_0    16.7
bs_1    41.7
bs_12   16.7
bs_24   16.7
bs_0    NA

本质上,我想删除 bs_24 中在 value 列中具有 NA 的所有行,同时保留 bs_0、bs_1 和 bs_12 中的所有 NA。

所以它应该是这样的

bs_Scores   value
bs_0    16.7
bs_1    41.7
bs_12   33.3
bs_0    25
bs_1    41.7
bs_12   NA
bs_24   0
bs_0    16.7
bs_1    41.7
bs_12   16.7
bs_24   16.7
bs_0    NA

谢谢!

【问题讨论】:

  • 如果预期的输出是正确的,我不确定我发布的解决方案有什么问题
  • 对不起我的错。我刚刚意识到我没有 NA,而是空白(没有数据)。所以我不知道如何摆脱 bs_24 = 空白
  • bs_24 是“bs_Scores”中的一个值

标签: r dataframe dplyr


【解决方案1】:

子集使用dplyr 你可以使用下面的代码


library(dplyr)

df %>% subset(!is.na(value) & bs_Scores != "bs_24" )

【讨论】:

    【解决方案2】:

    base Rsubset 一起使用

    subset(df1, !((is.na(value) & bs_Scores == 'bs_24')|bs_Scores == ""))
    

    -输出

     bs_Scores value
    1       bs_0  16.7
    2       bs_1  41.7
    3      bs_12  33.3
    5       bs_0  25.0
    6       bs_1  41.7
    7      bs_12    NA
    8      bs_24   0.0
    9       bs_0  16.7
    10      bs_1  41.7
    11     bs_12  16.7
    12     bs_24  16.7
    13      bs_0    NA
    

    数据

    df1 <- structure(list(bs_Scores = c("bs_0", "bs_1", "bs_12", "bs_24", 
    "bs_0", "bs_1", "bs_12", "bs_24", "bs_0", "bs_1", "bs_12", "bs_24", 
    "bs_0"), value = c(16.7, 41.7, 33.3, NA, 25, 41.7, NA, 0, 16.7, 
    41.7, 16.7, 16.7, NA)), class = "data.frame", row.names = c(NA, 
    -13L))
    

    【讨论】:

    • 感谢您的回复,但我注意到缺少 bs_24。我只希望 bs_24 = NA 丢失而不是其他值。
    • @HKJ3 我看了你的预期,它看起来与发布的解决方案完全一样
    • @HKJ3 在我的回答中,bs_12 NA 没有被删除
    • 你是对的。这是我的错。我只是注意到我有空白而不是 NA。我将如何过滤掉空白。
    • @HKJ3 尝试更新subset(df1, !((is.na(value) &amp; bs_Scores == 'bs_24')|bs_Scores == ""))
    【解决方案3】:

    dplyr 解决方案:

    library(tidyverse)
    
    bs_scores <- tibble::tribble(
                   ~bs_Scores, ~value,
                       "bs_0",   16.7,
                       "bs_1",   41.7,
                      "bs_12",   33.3,
                      "bs_24",     NA,
                       "bs_0",     25,
                       "bs_1",   41.7,
                      "bs_12",     NA,
                      "bs_24",      0,
                       "bs_0",   16.7,
                       "bs_1",   41.7,
                      "bs_12",   16.7,
                      "bs_24",   16.7,
                       "bs_0",     NA
                   )
    bs_scores %>% 
      filter(!(bs_Scores == "bs_24" & (is.na(value))))
    #> # A tibble: 12 × 2
    #>    bs_Scores value
    #>    <chr>     <dbl>
    #>  1 bs_0       16.7
    #>  2 bs_1       41.7
    #>  3 bs_12      33.3
    #>  4 bs_0       25  
    #>  5 bs_1       41.7
    #>  6 bs_12      NA  
    #>  7 bs_24       0  
    #>  8 bs_0       16.7
    #>  9 bs_1       41.7
    #> 10 bs_12      16.7
    #> 11 bs_24      16.7
    #> 12 bs_0       NA
    

    reprex package (v2.0.1) 于 2021 年 10 月 11 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2022-07-04
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多