[英]R - Looping through datasets and change column names
我试图遍历一堆数据集并更改R中的列。我有一堆数据集,例如a,b,c等,它们全部都有三列,例如X,Y,Z。喜欢将其名称更改为数据集a的a_X,a_Y,a_Z,以及数据集b的b_X,b_Y,b_Z,依此类推。
这是我的代码:
name.list = ("a","b","c")
for(i in name.list){
names(i) = c(paste(i,"_X",sep = ""),paste(i,"_Y",sep = ""),paste(i,"_Y",sep = ""));
}
但是,由于我是文本格式,因此上面的代码不起作用。 我考虑过分配功能,但似乎也不适合。 如果有任何想法我会很感激。
像这样的东西:
list2env(lapply(mget(name.list),function(dat){
colnames(dat) <- paste(nn,colnames(dat),sep='_')
dat
}),.GlobalEnv)
for ( i in name.list) {
assign(i, setNames( get(i), paste(i, names(get(i)), sep="_")))
}
> a
a_X a_Y a_Z
1 1 3 A
2 2 4 B
> b
b_X b_Y b_Z
1 1 3 A
2 2 4 B
> c
c_X c_Y c_Z
1 1 3 A
2 2 4 B
这里有一些免费数据:
a <- data.frame(X = 1, Y = 2, Z = 3)
b <- data.frame(X = 4, Y = 5, Z = 6)
c <- data.frame(X = 7, Y = 8, Z = 9)
这是一个使用mget
和自定义函数foo
name.list <- c("a", "b", "c")
foo <- function(x, i) setNames(x, paste(name.list[i], names(x), sep = "_"))
list2env(Map(foo, mget(name.list), seq_along(name.list)), .GlobalEnv)
a
# a_X a_Y a_Z
# 1 1 2 3
b
# b_X b_Y b_Z
# 1 4 5 6
c
# c_X c_Y c_Z
# 1 7 8 9
你也可以通过将a
, b
和c
放入他们自己的环境(甚至列表)来避免get
或mget
。 如果你走这条路线你也不需要name.list
向量,因为它与ls(e)
相同
e <- new.env()
e$a <- a; e$b <- b; e$c <- c
bar <- function(x, y) setNames(x, paste(y, names(x), sep = "_"))
list2env(Map(bar, as.list(e), ls(e)), .GlobalEnv)
这样做的另一个好处是你仍然拥有环境中未触及的数据框e
。 没有任何东西被覆盖(检查a
与e$a
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.