Переименование столбцов после имен данных - PullRequest
1 голос
/ 28 марта 2019

Я все еще новичок в R. У меня 24 файла csv.Я хотел бы импортировать их (сразу, без необходимости вызывать их по одному) как кадры данных с более короткими именами, и для каждого кадра данных заменить некоторые имена столбцов, основанные на имени кадра данных (или имени файла .csv).Ниже приведен пример с 3 фреймами данных.


df_ABX <- read.table(text = 'Name   col1    col2    col3    col4
                             name1  10  20  30  40
                             name2   5  10  15  20
                             name13 17  16  15  14', 
                 header = TRUE)  

df_BAX <- read.table(text = 'Name   col1    col2    col3    col4
                             name1  11  21  31  41
                             name2   4   9   8  19
                             name13 10  10  15  15', 
                 header = TRUE)

df_XAB <- read.table(text = 'Name   col1    col2    col3    col4
                             name1   9  19  29  28
                             name2  15  15  55  25
                             name13 18  10  11  12', 
                 header = TRUE)

В предыдущем примере я хотел бы импортировать файл csv с именами myverylongtitle_df_ABX.csv, myverylongtitle_df_ABX.csv и myverylongtitle_df_ABX.csv как фрейм данных со следующими именами: df_ABX, df_ABX, df_ABX.Затем я хотел бы, чтобы col1, col2, col3 были переименованы в A, B или X в зависимости от положения этих букв в имени кадра данных.Например: col2 следует переименовать после буквы в позиции 2 в именах данных, то есть: B, если датафрейм df_ABX, A, если датафрейм df_BAX, и Z, если фрейм данных df_XAB.То же самое должно применяться к col1 (позиция 1) и col3 (позиция 3).

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Мы можем использовать rename_at после помещения его в list

library(tidyverse)
lst(df_ABX, df_BAX, df_XAB) %>% 
      imap(~  {
      nm1 <- str_remove(.y, 'df_') %>%
               strsplit("") %>% 
               unlist
   .x %>%
         rename_at(2:4, ~ nm1)})
#$df_ABX
#    Name  A  B  X col4
#1  name1 10 20 30   40
#2  name2  5 10 15   20
#3 name13 17 16 15   14

#$df_BAX
#    Name  B  A  X col4
#1  name1 11 21 31   41
#2  name2  4  9  8   19
#3 name13 10 10 15   15

#$df_XAB
#    Name  X  A  B col4
#1  name1  9 19 29   28
#2  name2 15 15 55   25
#3 name13 18 10 11   12
1 голос
/ 28 марта 2019

Если у вас все в порядке со списком, это способ сделать это:

files <- c("myverylongtitle_df_ABX.csv","myverylongtitle_df_BAX.csv","myverylongtitle_df_BXA.csv")

lapply(files,function(file)
  {
  df <- read.table(file)
  spl <- strsplit(file,"_")[[1]]
  name <- sub("\\.csv","",spl[length(spl)])
  names(df)[2:4] <- strsplit(name,"")[[1]])
  return(paste0("df_",name)=df)
})
...