如何在R中循环涉及一个数据帧子集的函数?

时间:2019-04-04 20:11:29

标签: r loops

我是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 =”之类的标签。预先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

欢迎使用StackOverflow!

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

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

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

答案 1 :(得分:1)

还有其他方法也可以执行此操作,特别是如果您有非常大的数据。这里有一些:for循环,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 

tapply

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