繁体   English   中英

我可以使用列表/数据帧中的名称在 R 脚本中识别为循环函数的列表/数据帧名称吗?

[英]Can I use names from a list/dataframe, to be recognised as list/dataframe name within R script for a loop function?

我想使用循环函数将列表/数据框中的名称识别为 R 脚本中的实际列表/数据框名称(用于数据分析或操作)。 我将创建一些伪数据来帮助展示我正在尝试做的事情。

这是创建 3 个列表的代码

height <- sample(120:200,200,TRUE)
weight <- sample(40:140,200,TRUE)
income <- sample(20000:200000,200, TRUE)

此代码创建一个包含这些列表名称的列表

vars <- c("height","weight","income")

下面的代码没有运行,但我想使用这样的循环代码,它从列表位置获取名称并在脚本中将其用作列表名称。 因此,它使用名称来计算平均值,并使用名称创建一个新对象。

for (i in 1:3) 
 {mean_**vars[i]** = mean(**vars[i]**) }

结果应该是包含平均分数的 3 个对象“mean_height”、“mean_weight”、“mean_income”

我对平均分数的计算不太感兴趣,我对使用列表中名称的能力感兴趣。 我希望能够将其扩展到其他重复的分析。

抱歉,如果上面没有表达得很好,我对 R 很陌生,所以我希望它有道理。

任何帮助都将是最有用的,或者如果您能指出我正确的方向,那就太好了。

这可能是您正在寻找的,其中lapplymean函数应用于vars (数据lapply列表)中的每个项目。 请注意,您要使用变量名称制作数据框列表。

height <- sample(120:200,200,TRUE)
weight <- sample(40:140,200,TRUE)
income <- sample(20000:200000,200, TRUE)

vars <- list(height, weight, income)

lapply(vars, function(x) mean(x))

然后使用它创建一个输出数据帧:

df1 <- data.frame(lapply(vars, function(x) mean(x)))

colnames(df1) <- c("mean_height", "mean_weight", "mean_income")

df1

根据您的附加评论,使用vars <- list(height, weight, income)应该允许您执行此操作:

mean(height)
mean(vars[[1]])

[1] 160.48
[1] 160.48


这应该可以输出动态命名的变量:

vars <- list(height = height, weight = weight, income = income)

for (i in names(vars)){
  assign(paste("mean_", i, sep = ""), mean(vars[[i]]))
}

mean_height
mean_weight
mean_income

[1] 163.28
[1] 90.465
[1] 109686.5

但是,我建议不要那样编程,因为它会导致问题并且它的可扩展性不是很强。 例如,您可能会得到 10000 个变量。

R 中更常见的方法是使用数据列表,而不是单独的变量。

像这样:

# make this reproducible
set.seed(123)

# make an empty list for the data
raw_data <- list()

# then fill the list. The data can be of varying length in a list.
raw_data$height <- sample(120:200,200,TRUE)
raw_data$weight <- sample(40:140,200,TRUE)
raw_data$income <- sample(20000:200000,200, TRUE)

然后循环变成单行并保留您的名字,使用*apply函数系列:

mean_data <- lapply(raw_data, mean)

# print that
mean_data
$height
[1] 159.06

$weight
[1] 90.83

$income
[1] 114000.7

请注意我们没有做的事:

  • 知道变量的数量。
  • 具有相同长度的变量。
  • 建立一个循环并跟踪名称。

全部自动处理。 好的。

我想你想要的是像下面这样的东西,它会在你的全局环境中产生三个对象,用于weightheight和 list list income ,即,

list2env(setNames(Map(mean,lst),paste0("mean_",names(lst))),envir = .GlobalEnv)

数据

height <- sample(120:200,200,TRUE)
weight <- sample(40:140,200,TRUE)
income <- sample(20000:200000,200, TRUE)

lst <- list(height,weight,income)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM