将列的相对最小值放入单列数据帧R中

时间:2015-07-02 20:19:50

标签: r min

我正在使用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))

谢谢!

3 个答案:

答案 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