Mam następującą listę

my_list <- list(df1 = data.frame(A = c(1:3), B1 = c(4:6), B2 = c(7:9), B3 = c(10:12)),
            df2 = data.frame(A = c(1:4), B1 = c(5:8), B2 = c(9:12), B3 = c(13:16)), 
            df3 = data.frame(A = c(1:5), B1 = c(6:10), B2 = c(11:15), B3 = c(16:20)))

I chcę zmienić nazwę kolumn B1, B2, i B3 we wszystkich ramkach danych na tej liście do {x3}}, new2 i new2 i new2 X5}}. Czy istnieje sposób, aby zrobić to w jednym etapie (lub podobnie wydajnie) przy użyciu podstawy r (być może za pomocą funkcji gsub lub gsub)?

r
2
David Moore 23 luty 2019, 01:25

2 odpowiedzi

Najlepsza odpowiedź
lapply(my_list, function(x) setNames(x, gsub("B", "new", names(x))))
#$`df1`
#  A new1 new2 new3
#1 1    4    7   10
#2 2    5    8   11
#3 3    6    9   12

#$df2
#  A new1 new2 new3
#1 1    5    9   13
#2 2    6   10   14
#3 3    7   11   15
#4 4    8   12   16

#$df3
#  A new1 new2 new3
#1 1    6   11   16
#2 2    7   12   17
#3 3    8   13   18
#4 4    9   14   19
#5 5   10   15   20
4
d.b 22 luty 2019, 22:32

Prosta funkcja do zrobienia programowo, nie różni się (choć nie jest prawie tak dobra jak) dplyr::rename lub dplyr::select przy jego funkcjonalności nazwy:

rename <- function(x, mapping) {
  m <- match(mapping, colnames(x))
  isna <- is.na(m)
  colnames(x)[ m[!isna] ] <- names(mapping[!isna])
  x
}

lapply(my_list, rename, c(new1="B1", new2="B2", new3="B3"))
# $df1
#   A new1 new2 new3
# 1 1    4    7   10
# 2 2    5    8   11
# 3 3    6    9   12
# $df2
#   A new1 new2 new3
# 1 1    5    9   13
# 2 2    6   10   14
# 3 3    7   11   15
# 4 4    8   12   16
# $df3
#   A new1 new2 new3
# 1 1    6   11   16
# 2 2    7   12   17
# 3 3    8   13   18
# 4 4    9   14   19
# 5 5   10   15   20

Działa, gdy nic nie pasuje:

rename(mtcars[1:2,], c(A="a"))
#               mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
# Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
1
r2evans 22 luty 2019, 22:41