【问题标题】:Loop through each variable and collect output R循环遍历每个变量并收集输出 R
【发布时间】:2017-05-12 13:36:28
【问题描述】:

我有一个看起来像这样的数据框。名称和列数将不一致(有时不存在“C”,有时可能存在“D”、“E”、“F”等)

# name and number of columns varies...so need flexible process
A <- c(1, 2, 1, 2, 3, 2, 1, 1, 1, 2, 1, 4, 3, 1, 2, 2, 1, 2, 4, 8)
B <- c(5, 6, 6, 5, 3, 7, 2, 1, 1, 2, 7, 4, 7, 8, 5, 7, 6, 6, 4, 7)
C <- c(9, 1, 2, 2, 1, 4, 5, 6, 7, 8, 89, 9, 7, 6, 5, 6, 8, 9 , 67, 6)
ABC <- data.frame(A, B, C)

我想遍历每个变量并收集各种信息。这是一个简单的例子,但我所做的会更复杂。我这么说是为了让别人不只是推荐某种 summary() 类型的解决方案。

maximum_value <- max(A)
mean_value <- mean(A)
# lots of other calculations for A
ID = 'A'

tempA <- data.frame(ID, maximum_value, mean_value)

maximum_value <- max(B)
mean_value <- mean(B)
# lots of other calculations for B
ID = 'B'

tempB <- data.frame(ID, maximum_value, mean_value)

maximum_value <- max(C)
mean_value <- mean(C)
# lots of other calculations for C
ID = 'C'

tempC <- data.frame(ID, maximum_value, mean_value)

output <- rbind(tempA, tempB, tempC)

这是我尝试创建一个循环以逐个遍历变量并汇总输出。我不知道如何让 [i] 指向数据框 ABC 的单个列。

# initialize data frame
data__ <- data.frame(ID__ = as.character(),
                     max__ = as.numeric(),
                     mean__ = as.numeric())

# loop through A, then B, then C
for(i in A:C) {
  ID__ <- '[i]'
  max__ <- maximum[i]
  mean__ <- mean[i]
  data__temp <- (ID__, max__, mean__)
  data__ <- rbind(data__, data__temp)
}

如果我在 SAS 中执行此操作,我将在 proc sql 中使用 select into 创建变量名称列表,然后编写一个数组,然后我可以这样循环它们,但是我缺少一些东西在这里。

我将如何告诉 R 为数据框中的每个变量执行此过程?

【问题讨论】:

    标签: r loops


    【解决方案1】:

    如果你使用 tidyverse dplyr 和 tidyr 包,你可以这样做

    library(tidyr)
    ABC %>% gather(ID, value) %>% group_by(ID) %>% summarize_all(funs(mean, max))
    

    ABC %>% gather(ID, value) %>% group_by(ID) %>% 
        summarize(maximum_value = max(value), mean_value=mean(value))
    

    如果你更喜欢使用基函数并且有很多“奇怪”的函数,你可以使用purrr的map_df函数

    library(purrr)
    map2_df(ABC, names(ABC), function(a, n) {
        data_frame(ID=n, max_val=max(a), mean_val=mean(a))
    })
    

    【讨论】:

    • 我认为这并不能解决我的方案的两个主要问题。首先是变量的名称和数量将不一致。其次,我所做的不仅仅是计算汇总统计...只是将其用作示例流程,这样我们就不会被内部流程本身所困扰。
    • 此方法适用于所有变量,无论它们有多少。如果您想选择一个子集,则不清楚您想如何在您的问题中做到这一点。我添加了一种替代方法,但如果您只需要列值来生成统计信息,我真的不明白为什么这不起作用。如果您的示例与您的实际操作不够接近,这将有助于改进它。
    • 好的,我认为这绝对适用于我的示例,并且我认为我可以使它工作....但是为什么 R 程序员如此反对循环?它是一个处理约束吗?如果我有一个标准列“Y”,我想对每个变量进行回归并一次收集一个东西,除了其他东西,该怎么办?在这种情况下,我想遍历 Y~[i] 或其他东西......这更接近我的用例。我不想纠结于线性回归语法的细节,所以我提出了一个更基本的例子。这有意义吗?
    • 这是一个很难在评论中回答的大问题,我会尝试快速回答。与 for 循环相比,R 程序员倾向于更喜欢更高级别、更具表现力的函数。此外,默认情况下,更高级别的函数在内存管理方面更好。如果您对内存分配不小心,则可能会编写低效的 for 循环,而在 apply 或 map 函数中搞砸要困难得多。我们尝试使用让我们指定我们想要做什么而不是我们想要如何做的函数。
    • 请不要有意义地更改已回答的问题。而是问一个新的。但我相信你会在这个网站上找到许多关于循环遍历不同回归的现有问题。
    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多