使用 Apply 而不是 for(使用数据框的 2 列)
Using Apply instead of for (using 2 columns of a data frame)
我有一个这样的数据框:
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',按 'Letters' 分组, order
转换为 Date
class 后基于 'Dates' 的行,获取 '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))
这应该行得通!
library(plyr)
ddply(data, .(Letters), mutate, x2 = min(as.Date(Dates, format = "%d/%m/%Y")))
我有一个这样的数据框:
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',按 'Letters' 分组, order
转换为 Date
class 后基于 'Dates' 的行,获取 '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))
这应该行得通!
library(plyr)
ddply(data, .(Letters), mutate, x2 = min(as.Date(Dates, format = "%d/%m/%Y")))