如何针对两类DataFrame编写条件For循环处理列名?
处理两类结构差异DataFrame列表的条件循环实现
我有一个包含800个DataFrame的列表,这些DataFrame结构相近但列名存在差异,可分为两类:
- Type1:包含
Time、Place、Weather列 - Type2:包含
Place、Weather、Hours列
需要编写条件For循环对这两类DataFrame分别处理,参考示例代码如下:
# 生成400个类Type2结构的DataFrame(示例用Month代替Hours) myList = replicate(n = 400, expr = {data.frame(Place = c("Milan", "Rome", "Naples"), Weather = c("Hot-Wet", "Hot-SemiWet", "Hot-Windy"), Month = c("June", "June", "June"))}, simplify = F)
# 生成400个Type1结构的DataFrame add = replicate(n = 400, expr = {data.frame(Time = c("June", "June", "June"), Place = c("Milan", "Rome", "Naples"), Weather = c("Hot-Wet", "Hot-SemiWet", "Hot-Windy"))}, simplify = F)
# 合并两类DataFrame到同一个列表 myList <- c(myList, add)
针对需求的条件循环实现
如果需要将两类DataFrame统一列结构(比如把Type2的Hours重命名为Time),可以用以下循环:
# 先加载dplyr包(用于rename函数) library(dplyr) # 遍历列表中的每个DataFrame for(i in 1:length(myList)) { # 判断当前DataFrame是否为Type1(包含Time列) if("Time" %in% colnames(myList[[i]])) { # Type1无需处理,直接跳过 next } # 判断当前DataFrame是否为Type2(包含Hours列) else if("Hours" %in% colnames(myList[[i]])) { # Type2处理:将Hours列重命名为Time,统一列名 myList[[i]] <- rename(myList[[i]], Time = Hours) } }
基础R替代方案(无需依赖dplyr)
如果不想使用dplyr包,可改用基础R的setNames函数实现重命名:
for(i in 1:length(myList)) { if("Time" %in% colnames(myList[[i]])) { next } else if("Hours" %in% colnames(myList[[i]])) { myList[[i]] <- setNames(myList[[i]], gsub("Hours", "Time", colnames(myList[[i]]))) } }
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

