【问题标题】:Replacing NA with value from previous row or mutate with vector recycling in R [duplicate]用前一行中的值替换 NA 或用 R 中的向量循环进行变异 [重复]
【发布时间】:2021-06-04 15:41:56
【问题描述】:

嘿 :) 我目前正在尝试清理一些数据,并且正在努力寻找一个简单的解决方案。 这是我的数据集:

structure(list(sample = c(1, NA, NA, 2, NA, NA, 3, NA, NA, 4, 
NA, NA, 5, NA, NA, 6, NA, NA, 7, NA, NA, 8, NA, NA, 9, NA, NA, 
10, NA, NA, 11, NA, NA, 12, NA, NA, 13, NA, NA, 14, NA, NA, 15, 
NA, NA, 16, NA, NA, 17, NA, NA, 18, NA, NA, 19, NA, NA, 20, NA, 
NA), well = c("C1", "C3", "C5", "D1", "D3", "D5", "E1", "E3", 
"E5", "F1", "F3", "F5", "C7", "C9", "C11", "D7", "D9", "D11", 
"E7", "E9", "E11", "F7", "F9", "F11", "C13", "C15", "C17", "D13", 
"D15", "D17", "E13", "E15", "E17", "F13", "F15", "F17", "C19", 
"C21", "C23", "D19", "D21", "D23", "E19", "E21", "E23", "F19", 
"F21", "F23", "G1", "G3", "G5", "H1", "H3", "H5", "I1", "I3", 
"I5", "J1", "J3", "J5"), interp_conc = c(456582, 299611, 338462, 
449737, 395905, 546031, 511817, 473617, 455924, 408370, 461656, 
429297, 277609, 264949, 404073, 353142, 277509, 246494, 122663, 
163873, 169455, 188879, 192751, 255511, 185383, 205396, 187415, 
1897500, 1988346, 1854167, 365514, 295724, 262695, 270446, 241531, 
209386, 223774, 255885, 181214, 420567, 482818, 443318, 262886, 
220969, 283763, 229457, 261859, 202067, 226157, 177300, 215454, 
481414, 586233, 383855, 218949, 226852, 244989, 192648, 228195, 
201096)), row.names = c(NA, -60L), class = c("tbl_df", "tbl", 
"data.frame"))

它基本上是这样的:

这是一式三份的实验数据。这意味着,前三行是样本 1,接下来的三行是样本 2,...

所以基本上我需要的是一个函数,只要它找到一个 NA,它就会从上面的行中获取值。 R中有这样的东西吗?我找不到。

我尝试做的只是添加另一列 - “条件” - 使用 mutate 函数。由于我做的实验进行了五次,我希望向量能被回收。这是我的尝试:

temp %>% mutate(condition = c("UT", "UT", "UT",
                              "Stimuli", "Stimuli","Stimuli",
                              "Inhib1", "Inhib1","Inhib1",
                              "Inhib2", "Inhib2", "Inhib2"))

但由于似乎无法使用 dplyr::mutate 函数进行矢量回收,所以我也无法做到这一点。

采用第二种方法的优点是它直接添加了我必须在第二步中添加的关键信息。我最初的想法是先解决示例列问题,然后使用 if 语句添加实验条件...

有人知道我该如何解决这个问题吗?

【问题讨论】:

  • 试试tidyr::fillzoo::na.locf
  • thisthis

标签: r dataframe dplyr


【解决方案1】:

假设非NA 条目没有减少(如您的示例中所示),您可以这样做 cummax(ifelse(is.na(x), 0, x)),其中x 是您要以这种方式转换的向量(在您提供的内容中看起来像temp$sample)。

逻辑:cummax(),累积最大值函数,返回向量中顺序遇到的最大数。但是,它不能很好地处理 NA 值;这就是ifelse() 调用的目的。我们使用ifelse() 将每个NA 替换为0,然后使用cummax() 提取之前遇到的最大值。

例子:

x <- c(1, NA, NA, 2, NA, NA, NA, 3, NA, 4)

cummax(ifelse(is.na(x), 0, x))
## [1] 1 1 1 2 2 2 2 3 3 4

【讨论】:

    【解决方案2】:

    您可以使用 cmets 中指定的以下任一解决方案:

    library(dplyr)
    library(zoo)
    
    df %>%
      mutate(across(sample, ~ na.locf(.x)))
    
    # A tibble: 60 x 3
       sample well  interp_conc
        <dbl> <chr>       <dbl>
     1      1 C1         456582
     2      1 C3         299611
     3      1 C5         338462
     4      2 D1         449737
     5      2 D3         395905
     6      2 D5         546031
     7      3 E1         511817
     8      3 E3         473617
     9      3 E5         455924
    10      4 F1         408370
    # ... with 50 more rows
    

    或者

    library(tidyr)
    
    df %>%
      fill(sample, .direction = "down")
    
    # A tibble: 60 x 3
       sample well  interp_conc
        <dbl> <chr>       <dbl>
     1      1 C1         456582
     2      1 C3         299611
     3      1 C5         338462
     4      2 D1         449737
     5      2 D3         395905
     6      2 D5         546031
     7      3 E1         511817
     8      3 E3         473617
     9      3 E5         455924
    10      4 F1         408370
    # ... with 50 more rows
    

    【讨论】:

      猜你喜欢
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 2012-11-10
      • 2019-10-11
      相关资源
      最近更新 更多