[英]Replacing Column Name with Loop in R
我有三个 df P1、P2、P3,每三列。 我想通过循环将每个 df 的第二列更改为 D1、D2、D3,但没有任何效果。 我错过了什么?
C1 <- c(12,34,22)
C2 <- c(43,86,82)
C3 <- c(98,76,25)
C4 <- c(12,34,22)
C5 <- c(43,86,82)
C6 <- c(98,76,25)
C7 <- c(12,34,22)
C8 <- c(43,86,82)
C9 <- c(98,76,25)
P1 <- data.frame(C1,C2,C3)
P2 <- data.frame(C4,C5,C6)
P3 <- data.frame(C7,C8,C9)
x <- c("P1", "P2", "P3")
b <- c("D1","D2","D3")
for (V in b){
names(x)[2] <- "V"
}
我期望的 output 是:
P1 <- data.frame(C1,D1,C3)
P2 <- data.frame(C4,D2,C6)
P3 <- data.frame(C7,D3,C9)
我们可以使用mget
获取list
中字符串向量的值,使用Map
将第二列每个list
元素重命名为相应的 'b' 值,然后使用list2env
更新全局环境中的那些对象
list2env(Map(function(x, y) {names(x)[2] <- y; x}, mget(x), b), .GlobalEnv)
-输出
P1
# C1 D1 C3
#1 12 43 98
#2 34 86 76
#3 22 82 25
P2
# C4 D2 C6
#1 12 43 98
#2 34 86 76
#3 22 82 25
P3
# C7 D3 C9
#1 12 43 98
#2 34 86 76
#3 22 82 25
为了理解代码,第一步是对字符串向量进行mget
mget(x)
返回 data.frame list
然后,我们将其作为参数传递给Map
以及相应的“b”向量。 即list
的每个元素都是一个单位,类似地vector
的每个元素都是一个单位
Map(function(x, y) x, mget(x), b)
function(x, y)
是匿名/lambda function 结构。 使用它,我们将第二列的names
设置为“b”的名称。 这里,“b”的匿名参数是“y”。 稍后,我们将所有内容包装在list2env
中,因为它是一个命名list
,它将在全局环境中查找这些名称以更新它
通常最好使用此类事物的列表。 这可以让生活更轻松,通常是一个很好的学习工作流程。
list1 <- list(P1 = P1, P2 = P2, P3 = P3)
# here is your loop
for (i in seq_along(list1)) {
names(list1[[i]])[2] <- b[i]
}
# you can use Map as well for iteration, similar to @akrun's solution
# this is really identical at this point, except you've created the list differently
Map(function(df, b) {names(df)[2] <- b; df}, list1, b)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.