【问题标题】:R - looping through data.frames in a list - modify characters of column (list element)R - 遍历列表中的 data.frames - 修改列的字符(列表元素)
【发布时间】:2017-08-31 16:44:24
【问题描述】:

我有几千个 *.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 尝试过它,它在矢量级别上运行良好,但我遇到了对我在 R 中读取的数千个 csv 文件执行此操作的问题 - 我尝试如下 - 创建一个列表将所有 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) 和其中的数据框元素,所以我绞尽脑汁。列表。

我的列表ldf(包含单个 csv 文件的 df)如下所示:

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

我现在如何读取所有 CSV 文件,更改或匿名化整个甚至部分 "System_Name" 列,并在 R 中循环对我目录中的每个 CSV 执行此操作?不需要非常优雅 - 当它完成工作时我很高兴:-)

【问题讨论】:

  • lapply 用于您想要的功能列表。我不知道匿名器是如何工作的,在假设的情况下,函数就像anonymizer(column):lapply(list, function(x) anonymizer(x$System_Name))

标签: r loops csv dataframe anonymize


【解决方案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
  }
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多