Заменить определенные имена столбцов в списке фреймов данных

У меня есть список фреймов данных, и я хочу заменить имена столбцов, начинающиеся с ..., на имя предыдущего столбца.

Итак, отправная точка следующая:

df1 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df1

df2 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df2

df3 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df3

df.list<-list(df1, df2, df3)

И я хочу, чтобы столбцы во фреймах данных в списке выглядели следующим образом:

df1 <- data.frame(Tree=c(1:3), Sea=c(4:6), Sea=c(2:4), Beach=c(1:3), Beach=c(2:4))
df1

df2 <- data.frame(Tree=c(1:3), Sea=c(4:6), Sea=c(2:4), Beach=c(1:3), Beach=c(2:4))
df2

df3 <- data.frame(Tree=c(1:3), Sea=c(4:6), Sea=c(2:4), Beach=c(1:3), Beach=c(2:4))
df3

Первоначально проблема возникла из-за того, что я импортировал несколько фреймов данных из Excel в виде списка, в котором имена столбцов занимают более двух столбцов. Мне не удалось пометить оба столбца одним и тем же именем при импорте данных.

Буду очень признателен за вашу помощь. Спасибо!


person ZayzayR    schedule 16.09.2020    source источник
comment
Иногда перед импортом данных имеет смысл выполнить предварительную обработку в Excel.   -  person SteveM    schedule 16.09.2020


Ответы (1)


Я бы предложил следующий подход. Вы можете использовать функцию и lapply(), чтобы установить желаемое изменение. В функции myname() определяется структура для обнаружения шаблона в именах, а затем устанавливается значение NA. После этого мы будем использовать zoo функцию na.locf(), чтобы дополнить имена предыдущими значениями. Кроме того, иногда R имеет проблемы с дублированием имен в фрейме данных, поэтому я оставил в качестве комментария строку, которая может избежать этого, и вы должны прокомментировать строку, которая является следующей в этом комментарии, если необходимы уникальные имена. Вот код:

library(zoo)
#Data
df1 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df2 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df3 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df.list<-list(df1, df2, df3)
#Remove names
myname <- function(x)
{
  #Names of df
  v1 <- names(x)
  #Detect points
  index <- which(grepl('..',v1,fixed=T))
  v1[index]<-NA
  #Fill
  # v1 <- make.unique(na.locf(v1))
  v1 <- na.locf(v1)
  #Remove
  names(x) <- v1
  #Return
  return(x)
}
#Apply
df.list2 <- lapply(df.list,myname)

Выход:

df.list2
[[1]]
  Tree Sea Sea Beach Beach
1    1   4   2     1     2
2    2   5   3     2     3
3    3   6   4     3     4

[[2]]
  Tree Sea Sea Beach Beach
1    1   4   2     1     2
2    2   5   3     2     3
3    3   6   4     3     4

[[3]]
  Tree Sea Sea Beach Beach
1    1   4   2     1     2
2    2   5   3     2     3
3    3   6   4     3     4
person Duck    schedule 16.09.2020
comment
Это сработало! Спасибо! И не было проблем с дублированием имен. - person ZayzayR; 16.09.2020