我有一个数据帧列表,我想将以“ ...”开头的列名替换为之前的列名。
所以起点如下:
df1 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df1
df2 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df2
df3 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df3
df.list<-list(df1, df2, df3)
我希望列表中数据框中的列如下所示:
df1 <- data.frame(Tree=c(1:3), Sea=c(4:6), Sea=c(2:4), Beach=c(1:3), Beach=c(2:4))
df1
df2 <- data.frame(Tree=c(1:3), Sea=c(4:6), Sea=c(2:4), Beach=c(1:3), Beach=c(2:4))
df2
df3 <- data.frame(Tree=c(1:3), Sea=c(4:6), Sea=c(2:4), Beach=c(1:3), Beach=c(2:4))
df3
最初出现问题是因为我从Excel导入了一个列表中的几个数据框,该列表中的列名范围跨越两列。导入数据时,我无法用相同的列名标记两个列。
非常感谢您的帮助。谢谢!
答案 0 :(得分:1)
我建议采用下一种方法。您可以使用函数和lapply()
来设置所需的更改。在函数myname()
中定义了一种结构,用于检测名称中的模式,然后将其设置为NA
。之后,我们将使用zoo
函数na.locf()
来完成具有先前值的名称。另外,有时R
在数据框中存在重复名称的问题,这就是为什么我在注释中留下了可以避免这种情况的行,并且如果需要唯一名称,则应在该注释的下一行进行注释。这里的代码:
library(zoo)
#Data
df1 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df2 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df3 <- data.frame(Tree=c(1:3), Sea=c(4:6), ...3=c(2:4), Beach=c(1:3), ...5=c(2:4))
df.list<-list(df1, df2, df3)
#Remove names
myname <- function(x)
{
#Names of df
v1 <- names(x)
#Detect points
index <- which(grepl('..',v1,fixed=T))
v1[index]<-NA
#Fill
# v1 <- make.unique(na.locf(v1))
v1 <- na.locf(v1)
#Remove
names(x) <- v1
#Return
return(x)
}
#Apply
df.list2 <- lapply(df.list,myname)
输出:
df.list2
[[1]]
Tree Sea Sea Beach Beach
1 1 4 2 1 2
2 2 5 3 2 3
3 3 6 4 3 4
[[2]]
Tree Sea Sea Beach Beach
1 1 4 2 1 2
2 2 5 3 2 3
3 3 6 4 3 4
[[3]]
Tree Sea Sea Beach Beach
1 1 4 2 1 2
2 2 5 3 2 3
3 3 6 4 3 4