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

Place Relative Min Value Of A Column Into Single Column Data Frame R

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

谢谢!

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

考虑使用包 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 一个独特的组。

这是另一个解决方案:

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