Найдите значение в столбце X, которое соответствует последнему отсутствующему значению в столбце Y - PullRequest
0 голосов
/ 04 мая 2018
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, где я мог бы в конечном итоге выполнить эту операцию также для каждой группы, для большого набора данных и т. Д.

Есть идеи?

1 Ответ

0 голосов
/ 04 мая 2018

Вот идея через 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...