gpt4 book ai didi

SAS 宏变量的 R 版本?

转载 作者:行者123 更新时间:2023-12-02 09:29:37 27 4
gpt4 key购买 nike

我对SAS非常熟悉。我是 R 的初学者,我试图弄清楚宏变量的 R 等价物是什么。具体来说,我有 6 个数据集,它们有一个共同的变量名称,Price。我想创建一个循环,将每个数据集中的价格更改为 DatasetNamePrice。这在 SAS 中使用宏变量进行文本替换很简单。到目前为止,我已经创建了带有每个数据集名称的向量。

v=c("SP","SPF","SPP","NQ","RTY","NYA")

我通常使用此代码重命名变量:
names(SP)[names(SP)=="Price"]="SPPrice"

到目前为止,我的尝试是:
for(i in 1:6) 
{
names(v[[i]])[names(v[[i]])=="Price"]="v[[i]]Price"
}

R 在运行时不会给我任何错误,但似乎没有做任何事情。任何帮助表示赞赏。

最佳答案

这里有一些替代方案。

1) 基础 R 套装e成为数据框的环境。这里我们假设它们在当前环境中。有了这个 e[[nm]]指名称为变量nm中的字符串的数据框所以以下工作修改了适当的名称:

e <- environment()
for(nm in v) {
is.price <- names(e[[nm]]) == "Price"
names(e[[nm]])[ is.price ] <- paste0(nm, "Price")
}

1a) Base R 函数传递名称和环境 在这里,我们定义了一个函数,它接受数据框和环境的名称,并就地修改数据框的名称。我们使用 match而不是 ==以便 fromto可以选择是名称向量。此解决方案中的就地修改并不真正符合 R 的功能性本质,但我们将其作为替代方案展示:
rename1a <- function(DFname, from, to, envir = parent.frame()) {
ix <- match(from, names(envir[[DFname]]))
names(envir[[DFname]])[ ix ] <- to
}

for(nm in v) rename1a(nm, "Price", paste0(nm, "Price"))

1b) Base R 函数返回副本 在这里,我们定义了一个函数,它接受数据帧本身并返回一个名称已更改的副本。该函数本身不需要处理环境,并且本质上更具功能性(即它不修改其输入)——调用者负责将结果分配回来。
rename1b <- function(DF, from, to) {
names(DF)[match(from, names(DF))] <- to
DF
}

e <- environment()
for(nm in v) e[[nm]] <- rename1b(e[[nm]], "Price", paste0(nm, "Price"))

2) doBy::renameCol renameCol doBy 包中的插件与 rename1b 兼容在(1b)中,所以:
library(doBy)
e <- environment()
for(nm in v) e[[nm]] <- renameCol(e[[nm]], "Price", paste0(nm, "Price"))

3) plyr::重命名 plyr 包有一个 rename功能。请注意,像 (1b) 一样,它会生成带有重命名列的数据框的副本,因此我们将其分配回:
e <- environment()
for(nm in v) e[[nm]] <- plyr::rename(e[[nm]], list(Price = paste0(nm, "Price")))

reshape 包具有类似的功能,也称为 rename如果我们替换 plyr::rename,则上述内容有效与 reshape::rename .

4) gtools::defmacro 也可以使用 defmacro在 gtools 中创建一个宏来改变适当的名称。尽管在 R 中不是典型的处理,但这确实允许传递数据帧本身,而不是像 (1a) 中那样单独的名称和环境。
library(gtools)
rename4 <- defmacro(DF, from, to, expr = { names(DF)[ match(from, names(DF)) ] <- to })

e <- environment()
for(nm in v) rename4(e[[nm]], "Price", paste0(nm, "Price"))

另请参阅 R News 2001/3 中 Thomas Lumley 的 Programmer's Niche 文章.

注 1:您可能希望首先检查为什么要进行这些名称更改。还有一个问题是数据框是否应该在全局环境中自由定义或合并到一个列表中,因为我们想要一起处理它们。第一 Map创建一个命名列表 L例如, L$SPL[["SP"]]指的是 SP L 中的组件.第二个 Map输出一个新的命名列表,其组件具有新的列名:
L <- Map(get, v) # create named list of input data frames
Map(rename1b, L, "Price", paste0(names(L), "Price"))

注 2:在这里,我们使用内置数据框 BOD 创建一些输入以进行测试。 .这将创建对象 SP , SPF等与数据框相同的 BOD除了第二列名为 "Price" :
# create SP, SPF, ... to test, each with a Price column
v <- c("SP","SPF","SPP","NQ","RTY","NYA")
for(nm in v) assign(nm, setNames(BOD, c("Time", "Price")))

关于SAS 宏变量的 R 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34459445/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com