如何将行项数不等的稀疏CSV文件读取到R语言中
处理行长度不等的CSV数据:在R中按客户ID引用数据
首先,咱们先明确你的场景:你的CSV文件每行的字段数不一样,比如像这样:
Customer1, 01XX, 02XY, 05XYZ, 100XYZ, 03X23 Customer2, 02XX, 012X, 05XYZ Customer3, 01XX, 02XY, 05XYZ, 012X, 005XZZ, 100XYZ
你想要的是能像引用数据框那样,用客户ID直接调出对应的一串编码,对吧?
其实数据框不太适合这种变长数据,因为它要求每行列数一致,强行用read.csv的话会自动补NA,反而添乱。用命名列表才是更高效的方案,正好匹配你的需求,下面是具体步骤:
步骤1:读取并处理CSV行
先按行读取文件,再把每行分割成客户ID和对应的编码,最后整理成命名列表:
# 读取CSV的所有行(替换成你的文件路径) raw_lines <- readLines("your_customers.csv") # 处理每行:分割、去空格、生成命名列表 customer_data <- lapply(raw_lines, function(line) { # 分割行,同时去掉逗号前后的多余空格 split_parts <- strsplit(trimws(line), ",\\s*")[[1]] # 把第一个元素作为名字,剩下的作为对应的值 setNames(list(split_parts[-1]), split_parts[1]) }) # 把分散的小列表合并成一个统一的命名列表 customer_data <- unlist(customer_data, recursive = FALSE)
步骤2:按客户ID引用数据
现在你就可以直接用客户ID来调取对应的向量了,用法和你想要的几乎一致:
# 获取Customer2的编码向量 myVector <- customer_data[["Customer2"]] myVector # 输出结果: # [1] "02XX" "012X" "05XYZ"
关于你提到的“被踩”和方案选择
之前可能被踩的原因,大概率是有人默认用数据框处理CSV,但数据框天生不支持变长行,强行用的话会产生很多无用的NA,反而不符合你的实际需求。而用命名列表的话,既保留了每行的原始长度,又能通过客户ID快速索引,完全适配你的场景。
内容的提问来源于stack exchange,提问作者Jacek Kotowski
相关产品推荐
相关产品推荐

