【问题标题】:Output does not include the orginal variable name输出不包括原始变量名
【发布时间】:2019-12-21 14:26:21
【问题描述】:

当我使用 assign 函数然后使用 get 函数将数字分配给变量时,输出不包括原始变量名称。以下是问题的详细信息:

考虑

z=data.frame(x=c(1,2,3))

在数据框中保存名称。

names=names(z)

数据框只包含一个名称。

names[1]

现在我将数据框中第一列的值分配给数据框中的名称。

assign(names[1],z[,1])

问题是当我使用get函数进行一些测试时,输出不包含数据框中的原始名称,

shapiro.test(get(names[1]))

我得到的输出是:

    Shapiro-Wilk normality test

数据:get(names[1])

W = 1,p 值 = 1

【问题讨论】:

  • 感谢解释,我会更新帖子的。
  • 我真正需要的是用循环创建变量(数据框中的实际名称)。
  • 您的预期输出是什么?问题是shapiro.test 在其输出中显示的data: 行吗?你想让那行显示data: z$x吗? data: x?还有什么?
  • 非常感谢您的帮助。

标签: r


【解决方案1】:

data.frame

这将为z 中的每一列创建一个单列数据框

for(nm in names(z)) assign(nm, z[nm])

矢量

或者其中任何一个都将为z中的每一列创建一个向量

for(nm in names(z)) assign(nm, z[[nm]])

list2env(z, .GlobalEnv)

附加

这将在搜索列表中创建一个条目,其中包含z 中每一列的向量,而不会将它们放在全局环境中,因此您现在可以仅引用x

attach(z)

您可以使用以下方法检查搜索列表:

search()

使用完毕后分离z

detach("z")

下标

请注意,以上所有内容通常并不代表良好的编程习惯,最好只参考z$xz[["x"]]z["x"],具体取决于您的需要。

与,在,变换

您可以做的另一件事是使用withwithintransform。第一个返回一个等于2 * x 的向量,接下来的两个分别返回一个 x 已加倍的数据帧。

with(z, 2 * x)

within(z, x <- 2 * x)
transform(z, x = 2 * x)

shapiro.test

这将在z 的每一列上运行shapiro.test,尽管输出中的data: 行看起来不太好

lapply(z, shapiro.test)

这可以交替用于强制显示更好看的数据线(或者如果您知道z 中只有一列,那么可以写成my.shapiro.test(names(z), z))。

my.shapiro.test <- function(nm, z) with(z, do.call("shapiro.test", list(as.name(nm))))
lapply(names(z), my.shapiro.test, z)

或者可以使用第一种方法,然后修复数据名称,从而缩短代码,但缺点是它与shapiro.test 返回的内部结构相混淆。 (如果你知道z只有一列,那么它可以写成replace(shapiro.test(z[[1]]), "data.name", names(z))

L <- lapply(z, shapiro.test)
for(nm in names(L)) L[[nm]]$data.name <- nm

shapiro.test 相关的额外复杂性是由于它使用未经评估的参数版本来确定名称。 R 中的大多数函数都不会这样做(尽管 tidyverse 包是一个明显的例外),因此您不会遇到这样的复杂性。

【讨论】:

  • 感谢您的 anwser @ G. Grothendieck,但是否还有其他方法可以在不使用 with 函数的情况下解决此问题?
  • 我想简单地循环遍历我的数据框中的变量 t 执行 shapiro.test(同时在输出的数据框中生成原始变量名称)。
  • 我已经尝试了所有的代码,但是wih函数是我在输出中看到原始变量名的唯一方法。
  • 因为循环比功能更灵活,可能在不同的情况下很难使用。
  • 我不想手动命名变量的基本思想,而是想使用循环。我尝试粘贴函数来创建变量,然后分配函数来分配值。但是,无法在输出中检索变量的原始名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
相关资源
最近更新 更多