R - 遍历列表中的 data.frames - 修改列的字符(列表元素)
R - looping through data.frames in a list - modify characters of column (list element)
我有几千个 *.csv
文件(所有文件都有唯一的名称)但是 header - 文件中的列是相等的 - 比如 "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
列,甚至无法替换某些字符(对于 pseudo-anonymization)并循环遍历列表(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 执行此操作?不需要超级优雅 - 当它完成工作时我很高兴:-)
这样做的常见模式是:
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
}
)
我有几千个 *.csv
文件(所有文件都有唯一的名称)但是 header - 文件中的列是相等的 - 比如 "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
列,甚至无法替换某些字符(对于 pseudo-anonymization)并循环遍历列表(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 执行此操作?不需要超级优雅 - 当它完成工作时我很高兴:-)
这样做的常见模式是:
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
}
)