R - 循环遍历列表中的data.frames - 修改列的字符(列表元素)

时间:2017-08-31 16:44:24

标签: r loops csv dataframe anonymize

我有几千个*.csv个文件(所有文件都有一个唯一的名称),但文件中的标题 - 列相同 - 例如"Timestamp""System_Name",{{1}等等...... 我的问题是如何替换"CPU_ID"(这是一个系统名称,如"System_Name"或任何其他字符组合,并将其匿名化?我很感激任何提示或指向正确的方向.. 。
在CSV文件的结构下面......

"as12535.org.at"

我尝试使用R包"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中阅读的数千个csv文件 - 我尝试的是以下内容 - 创建列表中包含所有csv文件作为数据框的列表。

anonymizer

我正在扭曲我的大脑,因为我无法对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(包含单个csv文件的df)如下所示:

ldf

showing the structure of my list, containing all files contents as dataframe

我现在如何读取所有CSV文件,更改或匿名化summary(ldf) Length Class Mode [1,] 5 data.frame list [2,] 5 data.frame list [3,] 5 data.frame list 列的整个部分甚至部分内容,并为R中的循环中的每个目录中的每个CSV执行此操作?不需要超级优雅 - 当它完成工作时我很高兴: - )

1 个答案:

答案 0 :(得分:2)

执行此操作的常见模式是:

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
  }
)