将列的相对最小值放入单列数据框 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
我正在使用 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