I have 4 data.frames (d1,...d4). Some of these data.frames have more columns than others some less.
I wonder how to automatically find any of the colnames: "emmean","SE","t.ratio","df","p.value","lower.CL","upper.CL"
and then rename them to:
"Mean","SE","t","Df","p-value","Lower","Upper", respectively?
ps. We leave all other columns untouched. Note that I don't have a list of data.frames. I may get only one of the data.frames below.
d1="
training_hr time emmean SE df lower.CL upper.CL t.ratio p.value
23.145 Baseline NA NA NA NA NA NA NA
23.145 Post-test1 0.428 0.134 70.000 0.161 0.695 3.199 0.002
23.145 Post-test2 NA NA NA NA NA NA NA"
d1 = read.table(text=d1,h=T)
d2="
training_hr time emmean SE df lower.CL upper.CL t.ratio
23.145 Baseline NA NA NA NA NA NA
23.145 Post-test1 0.428 0.134 70.000 0.161 0.695 3.199
23.145 Post-test2 NA NA NA NA NA NA"
d2= read.table(text=d2,h=T)
d3="
training_hr time emmean SE df t.ratio p.value
23.145 Baseline NA NA NA NA NA
23.145 Post-test1 0.428 0.134 70.000 3.199 0.002
23.145 Post-test2 NA NA NA NA NA"
d3=read.table(text=d3,h=T)
d4="
training_hr emmean SE df t.ratio p.value
23.145 NA NA NA NA NA
23.145 0.428 0.134 70.000 3.199 0.002
23.145 NA NA NA NA NA"
d4=read.table(text=d4,h=T)
CodePudding user response:
Data Table
You can use setnames from data.table, which takes the old and new names as separate lists. Whereas with tidyverse, you have to give the old and new names together (e.g., Mean = "emmean"). But note setnames will change your original dataframe (changes them by reference).
library(data.table)
setnames(df1, old = c("emmean","SE","t.ratio","df","p.value","lower.CL","upper.CL"),
new = c("Mean","SE","t","Df","p-value","Lower","Upper"), skip_absent=TRUE)
Output
d1
training_hr time Mean SE Df Lower Upper t p-value
1 23.145 Baseline NA NA NA NA NA NA NA
2 23.145 Post-test1 0.428 0.134 70 0.161 0.695 3.199 0.002
3 23.145 Post-test2 NA NA NA NA NA NA NA
Tidyverse
With tidyverse, you can create an external vector with all of the possible name changes, then use any inside rename.
library(tidyverse)
lookup <- c(Mean = "emmean", SE = "SE", t = "t.ratio", DF = "df", "p-value" = "p.value", Lower = "lower.CL", Upper = "upper.CL")
d1 %>%
rename(any_of(lookup))
# training_hr time Mean SE DF Lower Upper t p-value
#1 23.145 Baseline NA NA NA NA NA NA NA
#2 23.145 Post-test1 0.428 0.134 70 0.161 0.695 3.199 0.002
#3 23.145 Post-test2 NA NA NA NA NA NA NA
For several dataframes, you could put the dataframes into a list then use a combination of map from purrr and setnames from data.table. This will also update all of the original dataframes by reference (i.e., d1, d2, ...).
library(data.table)
library(tidyverse)
df.list <- list(d1, d2, d3, d4)
map(df.list, ~ setnames(.x, old = c("emmean","SE","t.ratio","df","p.value","lower.CL","upper.CL"),
new = c("Mean","SE","t","Df","p-value","Lower","Upper"), skip_absent=TRUE))
