【发布时间】:2015-07-23 15:48:52
【问题描述】:
我有以下数据:
Name <- c("Sam", "Sarah", "Jim", "Fred", "James", "Sally", "Andrew", "John", "Mairin", "Kate", "Sasha", "Ray", "Ed")
Age <- c(22,12,31,35,58,82,17,34,12,24,44,67,43)
Group <- c("A", "B", "B", "B", "B", "C", "C", "D", "D", "D", "D", "D", "D")
data <- data.frame(Name, Age, Group)
我想使用 dplyr 来
(1) 按“Group”对数据进行分组 (2) 显示每个组内的最小和最大年龄 (3) 显示最小和最大年龄的人的姓名
下面的代码就是这样做的:
data %>% group_by(Group) %>%
summarize(minAge = min(Age), minAgeName = Name[which(Age == min(Age))],
maxAge = max(Age), maxAgeName = Name[which(Age == max(Age))])
效果很好:
Group minAge minAgeName maxAge maxAgeName
1 A 22 Sam 22 Sam
2 B 12 Sarah 58 James
3 C 17 Andrew 82 Sally
4 D 12 Mairin 67 Ray
但是,如果有多个最小值或最大值,我会遇到问题:
Name <- c("Sam", "Sarah", "Jim", "Fred", "James", "Sally", "Andrew", "John", "Mairin", "Kate", "Sasha", "Ray", "Ed")
Age <- c(22,31,31,35,58,82,17,34,12,24,44,67,43)
Group <- c("A", "B", "B", "B", "B", "C", "C", "D", "D", "D", "D", "D", "D")
data <- data.frame(Name, Age, Group)
> data %>% group_by(Group) %>%
+ summarize(minAge = min(Age), minAgeName = Name[which(Age == min(Age))],
+ maxAge = max(Age), maxAgeName = Name[which(Age == max(Age))])
Error: expecting a single value
我正在寻找两种解决方案:
(1) 显示最小或最大名称无关紧要,只显示一个(即找到的第一个值) (2) 如果有“关系”,则显示所有最小值和最大值
如果不清楚,请告诉我,并提前致谢!
【问题讨论】:
-
which.min和which.max取第一个值。 -
这对第一个解决方案非常有用,谢谢!
-
使用
data.table。setDT(data)[, c(.SD[which.min(Age)], .SD[which.max(Age)]), Group]并相应地更改名称 -
@akrun 一
.SD:setDT(data)[, .SD[c(which.min(Age),which.max(Age))], Group]。同样,选择行的东西在这里再次起作用:setDT(data)[data[, .I[c(which.min(Age),which.max(Age))], Group]$V1]。不过,这只是问题的前半部分(以防有人回答)。 -
@Frank 使用
c是一个很好的解决方案,但您的解决方案不是很长。