r - 用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"
}
我期望的输出是:
P1 <- data.frame(C1,D1,C3)
P2 <- data.frame(C4,D2,C6)
P3 <- data.frame(C7,D3,C9)
解决方案
我们可以使用mget
在 a 中获取字符串向量的值list
,使用相应的 'b' 值Map
重命名每个元素的第二列,然后使用在全局环境中更新这些对象list
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)
返回一个list
data.frame
然后,我们将它作为参数传递给Map
相应的“b”向量。即每个元素list
是一个单元,同样每个元素vector
是一个单元
Map(function(x, y) x, mget(x), b)
function(x, y)
is 匿名/lambda 函数构造。使用它,我们将names
第二列的设置为“b”。在这里,“b”的匿名参数是“y”。稍后,我们将所有内容都包装起来,list2env
因为它是一个命名的list
,它将在全局环境中查找这些名称以更新它
推荐阅读
- git - 重写历史后 Github 公共存储库搞砸了
- java - 如何从 JBOSS CLI 调用 JMS 临时队列上的操作
- django - 我可以以某种方式使用端点覆盖 django.settings
- asp.net - 视图或函数 [视图名称] 不可更新,因为修改会影响多个基表 - 在 POST 到任何和每个控制器时
- android - 如何从 Mysql 中获取 spinner 的选定数据并设置到 spinner
- java - 排列生成器 php/java 脚本
- c++ - 带有“find_first_of”函数的 C++ 字符串错误
- c# - 如何更新列表视图行中的状态?
- python - 如何获得一页 Instagram 的所有 Instagram 昵称?
- github-pages - 在 github 中托管的站点中看不到图像