【问题标题】:How to loop a function involving subsets of a data frame in R?如何循环涉及R中数据框子集的函数?
【发布时间】:2019-04-04 20:11:28
【问题描述】:

我是新的 R 用户,但在制作循环时遇到了一些困难。我在下面制作了一个更简单的数据版本来说明我正在尝试做的事情。

#My Data:

set.seed(123)
x <- runif(10,1,100)
y <- sample(LETTERS[1:3],10,replace=TRUE)

#Then I made subsets of my data in a data frame: 

df <- data.frame(x,y)
A <- subset(df, y=='A')
B <- subset(df, y=='B')
C <- subset(df, y=='C')

#I'm able to get the max and min of each subset like this: 

print(paste('A Max = ',max(A$x))); print(paste('A Min = ',min(A$x)))
print(paste('B Max = ',max(B$x))); print(paste('B Min = ',min(B$x)))
print(paste('C Max = ',max(C$x))); print(paste('C Min = ',min(C$x)))

我想创建一个循环,自动找到每个子集的最大值和最小值。理想情况下,它会一次打印所有结果,最好使用“Max =”之类的标签。提前感谢您的帮助!

【问题讨论】:

  • 你通常不会在 R 中使用循环来完成这样的事情。要么使用dplyr::group_by,要么你可以使用split()Map() 与基础R。
  • 一个选项是by(df, df$y, function(x) setNames(range(x$x), c("Min", "Max")))

标签: r loops


【解决方案1】:

欢迎来到 StackOverflow!

您可以使用library(dplyr) 并使用这些代码行:

df %>% 
  group_by(y) %>% 
  summarise(min = min(x),
            max = max(x))

要了解代码,请阅读 tidyverse 的一些介绍,例如here或部分链接here

【讨论】:

  • 非常感谢!这些链接非常有帮助。我认为循环是最简单的,但这似乎更简单一些。再次感谢!
【解决方案2】:

还有其他方法可以做到这一点,特别是如果您有非常大的数据。这里有几个:for-loop、sapplytapply

for 循环

for (i in LETTERS[1:3]) {
  cat(i, 'Max =', max(df$x[df$y == i]), '\n')
  cat(i, 'Min =', min(df$x[df$y == i]), '\n')
}

A Max = 94.10626 
A Min = 53.28244 
B Max = 88.41872 
B Min = 79.04221 
C Max = 46.20486 
C Min = 5.510093 

应用

invisible(
  sapply(LETTERS[1:3], function(i) {
    cat(i, 'Max =', max(df$x[df$y == i]), '\n')
    cat(i, 'Min =', min(df$x[df$y == i]), '\n')
  })
)

A Max = 94.10626 
A Min = 53.28244 
B Max = 88.41872 
B Min = 79.04221 
C Max = 46.20486 
C Min = 5.510093 

点击申请

min = with(df, tapply(x, y, min))
max = with(df, tapply(x, y, max))

【讨论】:

  • 我会说向新用户介绍get() 不是一个好主意。这肯定会导致以后出现问题。最好鼓励他们使用命名列表和拆分/应用策略,因为这更符合 R 哲学。
  • 感谢您向我展示了在这种情况下循环如何工作!我不是循环的忠实粉丝,但我没有意识到还有其他相对简单的方法可以做到这一点。我可能会尝试其他建议之一,但很高兴知道我可以在必要时进行循环。感谢弗利克先生的警告,我当然很欣赏这些谨慎的话。我很快意识到在 R 中搞砸事情是多么容易。
  • 同意。修复了for 循环和sapply() 以摆脱get()。还提供了另一种使用tapply() 的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多