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

时间:2019-09-17 21:28:55

标签: r

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

假设我有一个这样的数据框:

df <- data.frame(x1 = "ID: 4",
    x2 = "Start Date: 1946/11/13",
    x3 = "End Date: 1946/12/31")
 x1                     x2                   x3
ID: 4 Start Date: 1946/11/13 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(" ", "_")}) 

感谢您解决此问题:)

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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"  

答案 2 :(得分:0)

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

names(df) <- sapply(df[1,], function(x) {stringr::str_extract(x,"[^:]+") %>% stringr::str_replace(" ", "_")})
df <- rbind(df, sapply(df[1,], function(x) {stringr::str_extract(x,":.+$") %>% stringr::str_replace(": ", "")}))
df <- df[2, ]