我有一个像这样的数据框:
Letters Dates
A 22/03/2015
A 22/03/2015
A 23/03/2015
B 22/03/2015
B 23/03/2015
C 23/03/2015
C 23/03/2015
我想创建另一列 (Dates2),它在每一行指定具有该字母的所有行的最小日期。这是结果:
Letters Dates Dates2
A 22/03/2015 22/03/2015
A 22/03/2015 22/03/2015
A 23/03/2015 22/03/2015
B 22/03/2015 22/03/2015
B 23/03/2015 22/03/2015
C 23/03/2015 23/03/2015
C 23/03/2015 23/03/2015
我用 for 循环编写了以下代码,但我想更有效地完成它(使用向量而不是循环)。我如何使用应用/其他解决方案来做到这一点?
rm(list=ls())
data <- data.frame(rbind(c("A", "22/03/2015"),
c("A", "22/03/2015"),
c("A", "23/03/2015"),
c("B", "22/03/2015"),
c("B", "23/03/2015"),
c("C", "23/03/2015"),
c("C", "23/03/2015")
), stringsAsFactors=FALSE)
colnames(data) <- c("Letters", "Dates")
for (i in 1:nrow(data))
{
thisLetter = data$Letters[i]
temp = subset(data$Dates, data$Letters == thisLetter)
min_date = min(as.Date(temp, "%d/%m/%Y"))
data$Dates2[i] = format(min_date, "%d/%m/%Y")
}
非常感谢!
最佳答案
我们可以使用data.table
。将“data.frame”转换为“data.table”,按“字母”分组,转换为“日期”类后根据“日期”对行进行排序,得到'Dates' 的第一个元素 (head(Dates, 1)
) 并对其进行赋值 (:=
) 以创建 'Dates2' 列。
library(data.table)
setDT(data)[order(as.Date(Dates)), Dates2 := head(Dates,1), by = Letters]
或dplyr
library(dplyr)
data %>%
group_by(Letters) %>%
arrange(as.Date(Dates)) %>%
mutate(Date2 = first(Dates))
关于r - 使用Apply而不是for(使用数据框的2列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40467552/