【问题标题】:Loop over a list of dataframes and change column names in R循环遍历数据框列表并更改 R 中的列名
【发布时间】:2019-10-18 09:03:29
【问题描述】:

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

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, ]

  }

}

这不起作用,我错过了什么,我的预期输出是具有相同列名的数据框列表,这些列名应该是 V1V2

【问题讨论】:

  • 删除dflist&lt;-c(),因为现在dflist将为空,将if(dflist[[i]][names(dflist[[i]])] == remNames)替换为if(any(names(dflist[[i]]) == remNames)),看看for循环内部发生了什么;定义 i=1 然后像往常一样在 R 控制台中运行主体。
  • @A. Suliman 我不明白,你能重现代码吗?我已经尝试修复它,但我得到了错误

标签: r dataframe


【解决方案1】:
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]])))){...}

【讨论】:

    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多