R - перебирать data.frames в списке - изменять символы столбца (элемента списка)

У меня есть пара тысяч *.csv файлы (все с уникальным именем), но заголовок - столбцы в файлах одинаковы - как "Timestamp", "System_Name", "CPU_ID", так далее...
Мой вопрос, как я могу заменить "System_Name" (это системное имя как "as12535.org.at" или любая другая комбинация символов, и анонимизировать это? Я благодарен за любую подсказку или указание в правильном направлении...
Ниже структура файла CSV...

"Timestamp","System_Name","CPU_ID","User_CPU","User_Nice_CPU","System_CPU","Idle_CPU","Busy_CPU","Wait_IO_CPU","User_Sys_Pct"  
"1161025010002000","as06240.org.xyz:LZ","-1","1.83","0.00","0.56","97.28","2.72","0.33","3.26" 
"1161025010002000","as06240.org.xyz:LZ","-1","1.83","0.00","0.56","97.28","2.72","0.33","3.26" 
"1161025010002000","as06240.org.xyz:LZ","-1","1.83","0.00","0.56","97.28","2.72","0.33","3.26"

Я попробовал это с пакетом R anonymizer это прекрасно работает на векторном уровне, но я столкнулся с проблемами, которые делают это для тысяч файлов CSV, которые я читал в R - я попытался сделать следующее: создать список со всеми файлами CSV в качестве фреймов данных внутри списка.

initialize a list
r.path <- setwd("mypath")
ldf <- list()

# creates the list of all the csv files in my  directory - but filter for 
# files with Unix in the filename for testing.
listcsv <- dir(pattern = ".UnixM.") 

for (i in 1:length(listcsv)){
ldf[[i]] <- read.csv(file = listcsv[i]) 
}

Я выкручивал свой мозг до смерти, так как не мог анонимировать System_Name столбец или даже заменить некоторые символы (для псевдоанонимизации) и перебрать список (ldf) и элементы dataframe этого самого списка.

Мой список ldf (содержит df для отдельных файлов CSV) выглядит следующим образом:

summary(ldf)
Length Class      Mode
[1,] 5      data.frame list
[2,] 5      data.frame list
[3,] 5      data.frame list

показывает структуру моего списка, содержащего все файлы в виде dataframe

Как я могу теперь читать во всех файлах CSV, изменять или анонимизировать все или даже части "System_Name" столбцы, и сделать это для каждого CSV в моем каталоге, в цикле в R? Не нужно быть супер элегантным - я счастлив, когда он делает свою работу:-)

1 ответ

Решение

Обычная схема для этого будет:

df <- do.call(
  rbind,
  lapply(dir(pattern = "UnixM"), 
         read.csv, stringsAsFactors = FALSE)
)
df$System_Name <- anonymizer::anonymize(df$System_Name)

Он отличается от того, что вы пытались, тем, что связывает все фреймы данных в один, а затем анонимизирует.

Конечно, вы можете хранить все в списке, как предлагает @S Rivero. Это будет выглядеть так:

listdf <- lapply(
  dir(pattern = "UnixM"),
  function(filename) {
    df <- read.csv(filename, stringsAsFactors = FALSE)
    df$System_Name <- anonymizer::anonymize(df$System_Name)
    df
  }
)
Другие вопросы по тегам