【问题标题】:Find the value in column X that corresponds to last missing value in column Y在 X 列中查找与 Y 列中最后一个缺失值相对应的值
【发布时间】:2018-05-04 06:44:19
【问题描述】:
df <- data.frame(a = c(rep("a", 3), rep("b", 3), rep("c", 3)),
                 b = c(NA, NA, "test", NA, "test", "test", NA, NA, "test"),
                 c = c("trial", "test", "trial", "trial", "test", "trial", "trial",
                       "trial", "trial"), stringsAsFactors = FALSE)  

假设 df 包含三个变量 - 1 个组 (a)、1 个 b 值和 1 个 c 值。

我想要的是为每一行找到 c 列中与 b 列中最后一个缺失值相对应的值。

我的预期输出是 try 列中的内容。

+---------------------+
| try   a  b    c     |
+---------------------+
| trial a NA   trial  |
| test  a NA   test   |
| test  a test trial  |
| trial b NA   trial  |
| trial b test test   |
| trial b test trial  |
| trial c NA   trial  |
| trial c NA   trial  |
| trial c test trial  |
+---------------------+  

目前,我做了一个快速但低效的循环,也不允许我对任何内容进行分组。

miss <- c()
try <- c()

for (i in 1:length(df$b)) {

  miss[i] <- max(which(is.na(df[1:i,]$b)))

  try[i] <- df[miss[i], 3]

}

new <- cbind(as.data.frame(try), df)

但是,我想将其转换为 data.table 或 dplyr 方法,最终我可以在每个组、大型数据集等上执行此操作。

有什么想法吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    这是dplyr的一个想法,

    library(tidyverse)
    
    #METHOD 1:
    df %>% 
     group_by(a) %>% 
     mutate(new = tail(c[is.na(b)], 1), 
            new = replace(new, is.na(b), c[is.na(b)]))
    
    #METHOD 2:
    df %>% 
     group_by(a) %>% 
     mutate(new = replace(c, !is.na(b), NA)) %>% 
     fill(new)
    

    双方都给予,

    # A tibble: 9 x 4
    # Groups:   a [3]
      a     b     c     new  
      <chr> <chr> <chr> <chr>
    1 a     <NA>  trial trial
    2 a     <NA>  test  test 
    3 a     test  trial test 
    4 b     <NA>  trial trial
    5 b     test  test  trial
    6 b     test  trial trial
    7 c     <NA>  trial trial
    8 c     <NA>  trial trial
    9 c     test  trial trial
    

    【讨论】:

    • 非常感谢!这行得通,但我最感兴趣的是第二种方法,因为我想处理每组有几个单独的非空行的案例。由于 tidyr 填充的糟糕体验,我将用 na.locf 替换它;-)(它可能需要很长时间,即使只有几千行 ..)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多