【问题标题】:Can I use names from a list/dataframe, to be recognised as list/dataframe name within R script for a loop function?我可以使用列表/数据框的名称,在 R 脚本中被识别为列表/数据框名称以用于循环函数吗?
【发布时间】:2020-05-23 16:44:19
【问题描述】:

我想使用循环函数将列表/数据框中的名称识别为 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 还是很陌生,所以我希望它有一定的意义。

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

【问题讨论】:

    标签: r parsing for-loop variables type-conversion


    【解决方案1】:

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

    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 &lt;- 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 个变量。

    【讨论】:

    • 谢谢,这很有帮助。这不是我想要的,但绝对可以使用它。我添加了其他评论。
    • @H.Cheung 哦,好吧。我添加了一个编辑,我认为mean(vars[[1]]) 是您在制作数据框列表后想要的。 [[ 可能是您所缺少的。
    • @H.Cheung 好的,我已经在答案中添加了一些
    【解决方案2】:

    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
    

    注意我们不需要要做的事情:

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

    全部自动处理。不错。

    【讨论】:

    • 谢谢,这很有帮助。这不是我想要的,但绝对可以使用它。我添加了其他评论
    【解决方案3】:

    我猜你想要的是下面这样的东西,它会在你的全局环境中生成三个对象,用于列表 list 中的 weightheightincome,即,

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多