Если значение не найдено в таблице, укажите NA R - PullRequest
0 голосов
/ 06 декабря 2018

У меня следующая проблема.У меня есть список столбцов тибблов, которые я хочу очистить, просто взяв определенные значения и создав из них новый тиббл.Проблема в том, что не все столбцы доступны в оригинальной таблице, поэтому я хотел бы заменить их на NA.Пример прояснит это.

ДАННЫЕ:

tbl <- tibble(list_col = list(tibble(id = c("A", "B", "C"),
                                    val1 = c(1, 2, 3),
                                    val2 = c(11, 22, 33)),
                             tibble(id = c("A", "B", "C"),
                                    val1 = c(1, 2, 3))))

Реальные данные более сложны, но этого будет достаточно, чтобы показать проблему.Я создал функцию для выбора столбцов, которые я хотел бы иметь.Я теперь все дни обертываю с possibly, чтобы избежать провала.

get_res <- possibly(function(ls){
  out = tibble(id = ls$id,
               val1 = ls$val1,
               val2 = ls$val2)
  return(out)
}, otherwise = NA)

Тогда я обычно map работаю с mutate, чтобы создать чистый столбец.

tbl %>% 
  mutate(clean = map(list_col, get_res))

# A tibble: 2 x 2
  list_col         clean           
  <list>           <list>          
1 <tibble [3 x 3]> <tibble [3 x 3]>
2 <tibble [3 x 2]> <lgl [1]>       
Warning message:
Unknown or uninitialised column: 'val2'. 

Ожидаемый результат, но как я могу обойти это и заменить val2 на NA во втором столбце и вернуть значения, которые у меня есть?

Я думал, что это сработало бы:

get_res2 <- possibly(function(ls){
  out = tibble(id = ls$id,
               val1 = ls$val1,
               val2 = tryCatch(ls$val2, error=function(e) NA))
  return(out)
}, otherwise = NA)

Но это не удастсяа также.

1 Ответ

0 голосов
/ 07 декабря 2018

Вот хороший трюк для этого:

tbl %>% 
  mutate(clean = map(list_col, bind_rows,
                     tibble(id = character(), val1 = double(), val2 = double())))
# A tibble: 2 x 2
#   list_col         clean           
#   <list>           <list>          
# 1 <tibble [3 × 3]> <tibble [3 × 3]>
# 2 <tibble [3 × 2]> <tibble [3 × 3]>

Использование факта, что вы заранее знаете, что такое столбцы + создание пустого tibble + bind_rows для заполнения пустых NA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...