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

问题描述 投票:0回答:1

想象一个具有许多字符串列的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]"))

[我正在寻找一种快速的(我正在使用的数据帧包含越来越多的向量)解决方案(最好是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()和starts_with(“ vec”)来一次修复所有列。

[更重要的是,我正在努力转换为数值向量,导致2个列表列具有一个数值向量,每行和每列中有4个元素。我只设法像这样提取和转换单个向量:

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

但是,我想避免所有向量之间出现循环。非常感谢您的帮助。

r list vector data-conversion
1个回答
0
投票

您可以使用:

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

#     id                                                             vec1
#1  1 -4.16121967e-02, 4.51207198e-02, -7.89282843e-02, 4.02516453e-03
#2  2 -7.52146867e-02, 3.78264938e-02, -1.03749274e-02, 4.02516453e-03
#3  3 -2.13926377e-02, 9.27949827e-02, -5.89836483e-02, 2.44455224e-03
                                                          vec2
#1 -4.16121967e-02, 4.51207198e-02, -7.89282843e-02, 4.02516453e-03
#2 -7.40210414e-02, 1.75862815e-02, -1.03749274e-02, 4.02516453e-03
#3 -6.73705637e-02, 9.27949827e-02, -8.35041553e-02, 2.44455224e-03
© www.soinside.com 2019 - 2024. All rights reserved.