base R
1) scan sub - =, sub data.frame matrix, scan vector . (c(FALSE, TRUE)) "v1" "df2", unique , "v1", c(TRUE, FALSE) vector.
df2 <- df1
v1 <- scan(text=sub("=\\s+", "", as.matrix(df1)), what="", sep=" ", quiet=TRUE)
df2[] <- v1[c(FALSE, TRUE)]
colnames(df2) <- unique(v1[c(TRUE, FALSE)])
df2
2) sub - , (\\1) (lapply(df1, ..)
df2[] <- lapply(df1, function(x) sub(".*\\b(\\w+)$", "\\1", x))
3) strsplit - ("=\\s+) (tail, 1) , 2)
df2[] <- lapply(df1, function(x) sapply(strsplit(x, "=\\s+"), tail, 1))
2- 3- , sub unlist ted
colnames(df2) <- sub("\\s+=.*", "", unlist(df1[1,], use.names = FALSE))
1) str_extract - (\\w+) $ lapply list ('df2'). , sub unlist ed.
library(stringr)
df2[] <- lapply(df1, function(x) str_extract(x, "\\w+$"))
colnames(df2) <- word(unlist(df1[1,]), 1)
df2
# Auto Engine Trans
#1 Chevy V6 Auto
#2 Chevy V8 Manual
#3 Chevy V10 Manual
2) tidyverse
library(dplyr)
library(tidyr)
gather(df1) %>%
separate(value, into = c("header", "value")) %>%
group_by(key) %>%
mutate(i1 = row_number()) %>%
ungroup() %>%
select(-key) %>%
spread(header, value) %>%
select(-i1)
# A tibble: 3 × 3
# Auto Engine Trans
#* <chr> <chr> <chr>
#1 Chevy V6 Auto
#2 Chevy V8 Manual
#3 Chevy V10 Manual
df1 <- structure(list(V1 = c("Auto = Chevy", "Auto = Chevy", "Auto = Chevy"
), V2 = c("Engine = V6", "Engine = V8", "Engine = V10"), V3 = c("Trans = Auto",
"Trans = Manual", "Trans = Manual")), .Names = c("V1", "V2",
"V3"), class = "data.frame", row.names = c(NA, -3L))