Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于值的字符串提取重命名R数据框列名_R - Fatal编程技术网

基于值的字符串提取重命名R数据框列名

基于值的字符串提取重命名R数据框列名,r,R,我正在处理一个从同事那里继承的项目中的半结构化wiki数据,但在整理这些数据时遇到了一些困难。它有很多问题,但我需要做的第一件事就是创建合理的列名 假设我有这样一个数据帧: df <- data.frame(x1 = "ID: 4", x2 = "Start Date: 1946/11/13", x3 = "End Date: 1946/12/31") ID Start_Date End_Date 4 1946/11/13 1946/12/31 我想提取冒号前的值中

我正在处理一个从同事那里继承的项目中的半结构化wiki数据,但在整理这些数据时遇到了一些困难。它有很多问题,但我需要做的第一件事就是创建合理的列名

假设我有这样一个数据帧:

df <- data.frame(x1 = "ID: 4",
    x2 = "Start Date: 1946/11/13",
    x3 = "End Date: 1946/12/31")
ID Start_Date End_Date
4  1946/11/13 1946/12/31

我想提取冒号前的值中的所有内容,并基于此提取重命名列,以便我的数据框如下所示:

df <- data.frame(x1 = "ID: 4",
    x2 = "Start Date: 1946/11/13",
    x3 = "End Date: 1946/12/31")
ID Start_Date End_Date
4  1946/11/13 1946/12/31

到目前为止,我已经了解到我可以使用stringr包中的str_extract来提取感兴趣的字符串,但是我在如何使用这个结果列表来重命名列名上遇到了困难

library(tidyverse)

map(df, function(x) {str_extract(x,"[^:]+") %>% str_replace(" ", "_")}) 

感谢您检查此问题:)

我们可以使用一点正则表达式魔术来获取出现在“:”字符之前的任何内容,然后将结果分配给数据框的列名:

df <- data.frame(x1 = "ID: 4",
                 x2 = "Start Date: 1946/11/13",
                 x3 = "End Date: 1946/12/31")

labels <- sapply(df[1, ], sub, pattern = '(?=:).*', replacement = '\\1', perl = T)
labels <- gsub(' ', '_', labels)
colnames(df) <- labels

> colnames(df)
[1] "ID"         "Start_Date" "End_Date"  

df
df您只有一行还是多行?@M——实际数据将有多行,但冒号前面的字符串(即id、开始日期等)不应更改。
nm = gsub("\\s", "_", sapply(df[1,], function(x) gsub("(.*):.*", "\\1", x)))
setNames(data.frame(lapply(df, function(x) gsub(".*:\\s?(.*)", "\\1", x))), nm)
#  ID Start_Date   End_Date
#1  4 1946/11/13 1946/12/31