R 如何按组获取最小值

R 如何按组获取最小值,r,dplyr,R,Dplyr,我有一个像这样的数据框 library(dplyr) test.df <- data.frame(id=c(1,1,1,3,3,3,3), date=c("2016-02-13","2016-06-01", "2016-09-01","2015-08-02", "2015-09-21","2016-12-01",

我有一个像这样的数据框

library(dplyr)
test.df <- data.frame(id=c(1,1,1,3,3,3,3),
                      date=c("2016-02-13","2016-06-01",
                             "2016-09-01","2015-08-02",
                             "2015-09-21","2016-12-01",
                             "2017-02-11"))

test.df$date <- as.Date(test.df$date,format='%Y-%m-%d')

id    date
1   2016-02-13          
1   2016-06-01          
1   2016-09-01          
3   2015-08-02          
3   2015-09-21          
3   2016-12-01          
3   2017-02-11  
我尝试使用这样的代码

id    date      first.login
1   2016-02-13  2016-02-13
1   2016-06-01  2016-02-13      
1   2016-09-01  2016-02-13      
3   2015-08-02  2015-08-02      
3   2015-09-21  2015-08-02      
3   2016-12-01  2015-08-02      
3   2017-02-11  2015-08-02
new.df <- test.df %>% 
  group_by(id) %>% 
  mutate(first.log = min(date))
这应该不是一个棘手的任务,但我想知道我犯了什么错误?如何获取每个
id
组中的最早时间

更新: 我以前试过使用
总结

new.df <- test.df %>% 
  group_by(id) %>% 
  summarize(first.login = min(date))

结果证明这些代码没有问题;我只需要在其中指定
dplyr::mutate

您想使用summary而不是mutate

new.df <- test.df %>% 
  group_by(id) %>% 
  summarize(first.log = min(date))
new.df%
分组依据(id)%>%
汇总(first.log=min(日期))

您想使用摘要而不是变异

new.df <- test.df %>% 
  group_by(id) %>% 
  summarize(first.log = min(date))
new.df%
分组依据(id)%>%
汇总(first.log=min(日期))

当您需要每行一个结果,而不是每组一个值时,您应该使用基本R函数
ave

test.df$first.login <- ave(test.df$date, test.df$id, FUN = min)
test.df
#  id       date first.login
#1  1 2016-02-13  2016-02-13
#2  1 2016-06-01  2016-02-13
#3  1 2016-09-01  2016-02-13
#4  3 2015-08-02  2015-08-02
#5  3 2015-09-21  2015-08-02
#6  3 2016-12-01  2015-08-02
#7  3 2017-02-11  2015-08-02

test.df$first.login当您需要每行一个结果,而不是每组一个值时,您应该使用基本R函数
ave

test.df$first.login <- ave(test.df$date, test.df$id, FUN = min)
test.df
#  id       date first.login
#1  1 2016-02-13  2016-02-13
#2  1 2016-06-01  2016-02-13
#3  1 2016-09-01  2016-02-13
#4  3 2015-08-02  2015-08-02
#5  3 2015-09-21  2015-08-02
#6  3 2016-12-01  2015-08-02
#7  3 2017-02-11  2015-08-02

test.df$first.login这里有一个逐步的R基本解决方案:

# renaming for easy handle
x <- test.df$date
g <- test.df$id
# getting min
split(x, g) <- lapply(split(x, g), min)
# merging
test.df$first.login <- do.call("c", split(x, g))
#printting result
test.df
  id       date first.login
1  1 2016-02-13  2016-02-13
2  1 2016-06-01  2016-02-13
3  1 2016-09-01  2016-02-13
4  3 2015-08-02  2015-08-02
5  3 2015-09-21  2015-08-02
6  3 2016-12-01  2015-08-02
7  3 2017-02-11  2015-08-02
#重命名以便于处理

x这里有一个逐步的R基本解决方案:

# renaming for easy handle
x <- test.df$date
g <- test.df$id
# getting min
split(x, g) <- lapply(split(x, g), min)
# merging
test.df$first.login <- do.call("c", split(x, g))
#printting result
test.df
  id       date first.login
1  1 2016-02-13  2016-02-13
2  1 2016-06-01  2016-02-13
3  1 2016-09-01  2016-02-13
4  3 2015-08-02  2015-08-02
5  3 2015-09-21  2015-08-02
6  3 2016-12-01  2015-08-02
7  3 2017-02-11  2015-08-02
#重命名以便于处理

我认为您需要使用summary。我认为代码应该可以工作。注意,您的示例有一个列标题
first。登录
,而代码有
first.log=
。这是我的想法,但它只返回一列和一行
first.log 2015-08-02
。我想您需要使用summary。我认为代码应该可以工作。请注意,您的示例有一个列标题
first。登录
,而您的代码有
first.log=
。这是我的想法,但它只返回一列和一行
first.log 2015-08-02
。感谢您回答我的问题,我已经尝试过了,但它只返回一列和一行
first.log 2015-08-02
。同意。如果您想保留所有数据,则不太好谢谢您回答我的问题,我已经尝试过了,但它只返回一列和一行
first.log 2015-08-02
。同意。如果你想保留所有的数据,那就不好了