如何从 R 数据帧字符串列中提取数字向量并保存为包含向量的列(列表)
How to extract numeric vectors from R data frame string columns and save as columns (lists) with vectors
想象一个包含大量字符串列的 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'], ",")))
但是,我想避免遍历所有向量。非常感谢任何帮助。
我们可以使用 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
想象一个包含大量字符串列的 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'], ",")))
但是,我想避免遍历所有向量。非常感谢任何帮助。
我们可以使用 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