想象一个具有许多字符串列的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'], ",")))
但是,我想避免所有向量之间出现循环。非常感谢您的帮助。
您可以使用:
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