替换数据框列表中的某些列名
Replace certain colnames in a list of data frames
我有一个数据框列表,我想用前面的列名替换以“...”开头的列名。
所以出发点如下:
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 导入了一个列表中的多个数据框,其中列名分布在两列之间。导入数据时,我无法设法用相同的列名标记两列。
非常感谢您的帮助。谢谢!
我建议采用下一种方法。您可以使用函数和 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
我有一个数据框列表,我想用前面的列名替换以“...”开头的列名。
所以出发点如下:
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 导入了一个列表中的多个数据框,其中列名分布在两列之间。导入数据时,我无法设法用相同的列名标记两列。
非常感谢您的帮助。谢谢!
我建议采用下一种方法。您可以使用函数和 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