我正在使用R中的数据框,我希望找到每个日期的最小值,然后将该值放在数据框的单个列中。问题是每个日期的最小值应仅出现在该日期的行中。请看下面的内容,这将更加清晰。
Date Last
1 2015-06-21 2106.25
2 2015-06-21 2105.25
3 2015-06-21 2105.75
4 2015-06-22 2106.75
5 2015-06-22 2107.00
6 2015-06-22 2106.75
7 2015-06-23 2117.25
8 2015-06-23 2117.25
9 2015-06-23 2117.00
期望的输出:
Date Last Min
1 2015-06-21 2106.25 2105.25
2 2015-06-21 2105.25 2105.25
3 2015-06-21 2105.75 2105.25
4 2015-06-22 2106.75 2106.75
5 2015-06-22 2107.00 2106.75
6 2015-06-22 2106.75 2106.75
7 2015-06-23 2117.25 2117.00
8 2015-06-23 2117.25 2117.00
9 2015-06-23 2117.00 2117.00
要从每个日期提取分钟,我正在使用:
MinVal <- sapply(split(data, data$Date), function(x) min(x$Last))
输出很好:
2015-06-21 2015-06-22 2015-06-23
2105.25 2106.75 2117.00
现在,如何在名为Min的单个列中将其恢复到数据框中?使用这个sapply会创建一个我不想要的矩阵:
data$Min <- sapply(names(MinVal), function(i) ifelse(data$Date == i, MinVal[i], NA))
此命令将创建初始数据框:
data <- structure(list(Date = structure(c(16607, 16607, 16607, 16608,
16608, 16608, 16609, 16609, 16609), class = "Date"), Last = c(2106.25,
2105.25, 2105.75, 2106.75, 2107, 2106.75, 2117.25, 2117.25, 2117
)), .Names = c("Date", "Last"), class = "data.frame", row.names = c(NA,
9L))
谢谢!
答案 0 :(得分:4)
考虑使用包data.table
进行此类操作。这是一个例子:
library(data.table)
datadt <- data.table(data)
datadt[,Min:=min(Last),by=Date]
datadt
这会产生您想要的结果:
Date Last Min
1: 2015-06-21 2106.25 2105.25
2: 2015-06-21 2105.25 2105.25
3: 2015-06-21 2105.75 2105.25
4: 2015-06-22 2106.75 2106.75
5: 2015-06-22 2107.00 2106.75
6: 2015-06-22 2106.75 2106.75
7: 2015-06-23 2117.25 2117.00
8: 2015-06-23 2117.25 2117.00
9: 2015-06-23 2117.00 2117.00
:=
中的data.table
运算符允许您在现有data.table上创建列。 by参数可以做by
个唯一的组。
答案 1 :(得分:2)
dplyr
的一种方式:
data %>%
group_by(Date) %>% #group
mutate(Min = min(Last)) #add min Last per group
输出:
Source: local data frame [9 x 3]
Groups: Date
Date Last Min
1 2015-06-21 2106.25 2105.25
2 2015-06-21 2105.25 2105.25
3 2015-06-21 2105.75 2105.25
4 2015-06-22 2106.75 2106.75
5 2015-06-22 2107.00 2106.75
6 2015-06-22 2106.75 2106.75
7 2015-06-23 2117.25 2117.00
8 2015-06-23 2117.25 2117.00
9 2015-06-23 2117.00 2117.00
答案 2 :(得分:0)
这是另一种解决方案:
cbind(data[order(data$Date),],Min=min(data$Last))
输出:
Date Last Min
1 2015-06-21 2106.25 2105.25
2 2015-06-21 2105.25 2105.25
3 2015-06-21 2105.75 2105.25
4 2015-06-22 2106.75 2105.25
5 2015-06-22 2107.00 2105.25
6 2015-06-22 2106.75 2105.25
7 2015-06-23 2117.25 2105.25
8 2015-06-23 2117.25 2105.25
9 2015-06-23 2117.00 2105.25