我有一个数据帧列表,其中一些数据帧被列名称搞乱了,我的意图是遍历数据帧列的列表,识别那些列被弄乱的数据帧,然后能够删除列名并将第一行替换为列名,这是我的数据帧示例
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
答案 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]])))){...}