如何从R数据帧字符串列中提取数字向量,并使用向量另存为列(列表)

如何从R数据帧字符串列中提取数字向量,并使用向量另存为列(列表),r,list,vector,data-conversion,R,List,Vector,Data Conversion,想象一个R数据帧,它有许多字符串列,每行中的一些字符之间包含一系列数字(科学符号)。下面是一个简化的示例: 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-0

想象一个R数据帧,它有许多字符串列,每行中的一些字符之间包含一系列数字(科学符号)。下面是一个简化的示例:

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]"))
也许这一步有更好更优雅的解决方案。当我们这样做的时候:我真的想知道如何使用mutate_at()和以(“vec”)开头的_来同时修复我的所有列

更重要的是,我正在努力转换为数字向量,结果是两个列表列,一个数字向量,每行和每列中有4个元素。我只设法提取和转换如下的单个向量:

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, " ", ","))
as.numeric(unlist(strsplit(df[1,'vec1'], ",")))

但是,我希望避免在所有向量中循环。非常感谢您的帮助。

我们可以使用
mutate_at
将函数应用于多列,使用
gsub
删除字符
[a-d]
和方括号(
[]
),并将向量转换为数字以获得列表列

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