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
Как я могу теперь читать во всех файлах 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
}
)