循环浏览数据框列表并更改R中的列名

时间:2019-10-18 09:03:29

标签: r dataframe

我有一个数据帧列表,其中一些数据帧被列名称搞乱了,我的意图是遍历数据帧列的列表,识别那些列被弄乱的数据帧,然后能够删除列名并将第一行替换为列名,这是我的数据帧示例

dput(df)
structure(list(v1 = c("Silva", "Brandon", "Mango"),
               v2 = c("James","Jane", "Egg")),
          class = "data.frame", row.names = c(NA,  -3L))

dput(df2)
structure(list(X2 = c("v1", "Brandon", "Mango"),
               X..X1 = c("v2","Jane", "Egg")),
          class = "data.frame", row.names = c(NA,  -3L))

现在这是我的数据帧的示例,其中有一个数据帧,其中df2中的列名显示为行,我需要循环查看哪些数据帧弄乱了df2等列名,然后删除列名并替换第一行,这就是我尝试过的

dflist <- list(df,df2)
remNames <- c("X2", "X..x1")
dflist <- c()
for (i in 1:length(dflist)) {

  if(dflist[[i]][names(dflist[[i]])] == remNames){

    colnames(dflist[[i]]) <- dflist[[i]][1,]
    dflist[[i]] = dflist[[i]][-1, ]

  }

}

这不起作用,我错过了什么,我的期望输出是具有相同列名称的数据帧列表,这些列名称应该为 V1 V2

1 个答案:

答案 0 :(得分:0)

dflist <- list(df,df2)
for (i in 1:length(dflist)) {

if(any(names(dflist[[i]]) == remNames)){
    colnames(dflist[[i]]) <- dflist[[i]][1,]
    dflist[[i]] = dflist[[i]][-1, ]
  }

}

dflist[[i]][names(dflist[[i]])] == remNames将检查前一个数据帧,因此if将返回FALSE并且什么也没有发生,请考虑以下示例,当i=2

> i=2
> dflist[[i]][names(dflist[[i]])] == remNames
        X2 X..X1
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,] FALSE FALSE

一个更好的解决方案是使用grepl来查看列名是包含..还是X,因此if变为

if(any(grepl('\\.\\.|X',names(dflist[[i]])))){...}