我正在处理一个我从同事那里继承的项目中的半结构化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(" ", "_")})
感谢您解决此问题:)
答案 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, ]