Как извлечь числа чисел c из столбцов строки данных R и сохранить их как столбцы (списки) с векторами - PullRequest
0 голосов
/ 24 апреля 2020

Представьте себе фрейм данных R с многочисленными строковыми столбцами, которые содержат цепочку цифр (scientifi c нотация) между некоторыми символами в каждой строке. Вот упрощенный пример:

df <- data.frame(id = 1:3,
             vec1 = c("[a-4.16121967e-02 b4.51207198e-02 c-7.89282843e-02 d4.02516453e-03]", 
                      "[a-7.52146867e-02 b3.78264938e-02 c-1.03749274e-02 d4.02516453e-03]", 
                      "[a-2.13926377e-02 b9.27949827e-02 c-5.89836483e-02 d2.44455224e-03]"),
             vec2 = c("[a-4.16121967e-02 b4.51207198e-02 c-7.89282843e-02 d4.02516453e-03]", 
                      "[a-7.40210414e-02 b1.75862815e-02 c-1.03749274e-02 d4.02516453e-03]", 
                      "[a-6.73705637e-02 b9.27949827e-02 c-8.35041553e-02 d2.44455224e-03]"))

Я ищу быстрое (фрейм данных, с которым я работаю, содержит намного больше и гораздо большие векторы) решение (предпочтительно dplyr), которое преобразует векторные столбцы в списки с числовыми векторами для каждой строки.

До сих пор мне удавалось удалить ненужные символы и разделить элементы вектора запятыми следующим образом:

mutate(df, 
         vec1 = str_replace_all(vec1, "\\[|\\]|a|b|c|d", ""),
         vec1 = str_replace_all(vec1, " ", ","),
         vec2 = str_replace_all(vec2, "\\[|\\]|a|b|c|d", ""),
         vec2 = str_replace_all(vec2, " ", ","))

Может быть, есть лучшее и более элегантное решение для этого шага. Пока мы находимся: мне действительно интересно, как это сделать с помощью mutate_at () и start_with ("ve c"), чтобы исправить все мои столбцы одновременно.

Что более важно, я борется с преобразованием в числа c векторов, в результате чего получаются 2 столбца списка с одним числовым вектором с 4 элементами в каждой строке и столбце. Мне удалось только извлечь и преобразовать отдельные векторы, как это:

as.numeric(unlist(strsplit(df[1,'vec1'], ",")))

Однако я бы хотел избежать всех oop через все векторы. Любая помощь высоко ценится.

1 Ответ

1 голос
/ 24 апреля 2020

Мы можем использовать mutate_at, чтобы применить функцию к нескольким столбцам, удалить символы [a-d] и квадратные скобки ([]), используя gsub, и преобразовать вектор в число c, чтобы получить столбцы списка.

library(dplyr)

df %>% mutate_at(vars(vec1:vec2), 
        ~purrr::map(strsplit(gsub('[a-d]|\\[|\\]', '', .), "\\s+"), as.numeric))

#  id                                             vec1
#1  1 -0.04161220, 0.04512072, -0.07892828, 0.00402516
#2  2 -0.07521469, 0.03782649, -0.01037493, 0.00402516
#3  3 -0.02139264, 0.09279498, -0.05898365, 0.00244455

#                                              vec2
#1 -0.04161220, 0.04512072, -0.07892828, 0.00402516
#2 -0.07402104, 0.01758628, -0.01037493, 0.00402516
#3 -0.06737056, 0.09279498, -0.08350416, 0.00244455
...