在数据分析中,常常存在nestlist更有用的情况. 然而,在分析过程中,我有时希望将单个数据存储在具有适当名称的对象中,以保持代码简洁. 因此,我想以一种高效的方式创建这样的对象. 例如,请看下面的代码.

df <- iris |>
  tidyr::nest(.by = Species)

setosa <- df[["data"]][df[["Species"]] == "setosa"][[1]]
versicolor <- df[["data"]][df[["Species"]] == "versicolor"][[1]]
virginica <- df[["data"]][df[["Species"]] == "virginica"][[1]]

创建于2024-02-04与reprex v2.1.0

我们要在这里创建的对象是setosaversicolorvirginica. 我总是必须明确地指定这一点吗? 有没有办法自动创建对象本身?

在数据分析中,通常情况下嵌套比列表更有用. 然而,在分析过程中,我有时希望将单个数据存储在具有适当名称的对象中,以保持代码简洁. 因此,我想以一种高效的方式创建这样的对象. 例如,请看下面的代码.

我们要在这里创建的对象是setosaversicolorvirginica. 我总是必须明确地指定这一点吗? 有什么方法可以递归地创建对象本身吗?

例如,下面的代码不能正常工作,但它是一种将要创建的对象的名称向量作为参数并使用该名称创建对象的方法.

df$Species |> map(\(x) {
  sym(x) <- df[["data"]][df[["Species"]] == x][[1]]
})

推荐答案

您可以使用list2env()函数来实现这一点,

从命名列表x创建[S]一个包含所有列表组件作为对象的环境.

我们需要首先将名称设置为setNames(),并确保分配给的环境是global environment.

list2env(setNames(df$data, df$Species), envir = .GlobalEnv)

# Check it worked
all(
    identical(setosa, df[["data"]][df[["Species"]] == "setosa"][[1]]),
    identical(versicolor, df[["data"]][df[["Species"]] == "versicolor"][[1]]),
    identical(virginica, df[["data"]][df[["Species"]] == "virginica"][[1]])
) # TRUE

然而,通常情况下,将数据帧保存在列表中要比使全局环境变得混乱更好,而且这会使进一步的操作(如迭代)变得更加简单.

R相关问答推荐

多个ggpredicate对象的平均值

计算R中的威布尔分布的EDF

MCMC和零事件二元逻辑回归

咕噜中的元素列表:map

R-更新面内部的栅格值

R如何计算现有行的总和以添加新的数据行

在点图上绘制置信度或预测区间ggplot2

如何删除R中除数字元素以外的所有元素

如何使用字符串从重复的模式中提取多个数字?

R代码,用于在线条图下显示观测表

为什么函数toTitleCase不能处理english(1),而toupper可以?

Conditional documentr::R中数据帧的summarize()

如何显示准确的p值而不是<;0.001*?

如何移动点以使它们的打印不重叠

R:使用ApexCharge更改标签在饼图中的位置

R没有按顺序显示我的有序系数?

使用dqur在不同变量上创建具有多个条件的变量

打印的.txt文件,将值显示为&Quot;Num&Quot;而不是值

带查找数据的FCT_REORDER.帧

向数据添加标签