这就是我的数据框看起来像这样:
Code-1 Type Year Code-2
AB1034510 Type-A 2014 501324
AB1034927 Type-C 2013 501324
AB1039701 Type-B 2012 501325
AB1036802 Type-D 1998 501325
AB1031649 Type-F 2016 501328
但是这个数据框有大约450万行,有12列。
我试图运行for循环,以便我可以找到具有相同Code-2值的行,并从这些行中找到最旧的年份。然后,将最旧的年份分配给具有相同Code-2值的行。所以它看起来像这样:
Code-1 Type Year Code-2
AB1034510 Type-A 2013 501324
AB1034927 Type-C 2013 501324
AB1039701 Type-B 1998 501325
AB1036802 Type-D 1998 501325
AB1031649 Type-F 2016 501328
要完成此过程,我尝试了代码:
for (n in 1:nrow(df)) {
same.code2=which(df[n,4]==df[,4])
min.year=min(df[same.code2,3])
df[same.code2,3]=min.year
}
但似乎我做错了或运行代码需要很长时间。
请帮忙吗?
答案 0 :(得分:5)
使用data.table
。它快速而简单。
library(data.table)
dt <- data.table("Code-1" = c('AB1034510', 'AB1034927', 'AB1039701', 'AB1036802'),
Type = c('Type-A', 'Type-C', 'Type-B', 'Type-D'),
Year = c(2014, 2013, 2012, 1998),
"Code-2" = c(501324,501324,501325,501325))
dt[, Year := min(Year), by = 'Code-2']
之前的数据:
Code-1 Type Year Code-2
1: AB1034510 Type-A 2014 501324
2: AB1034927 Type-C 2013 501324
3: AB1039701 Type-B 2012 501325
4: AB1036802 Type-D 1998 501325
之后:
Code-1 Type Year Code-2
1: AB1034510 Type-A 2013 501324
2: AB1034927 Type-C 2013 501324
3: AB1039701 Type-B 1998 501325
4: AB1036802 Type-D 1998 501325
答案 1 :(得分:2)
我们可以使用data.table
library(data.table)
setDT(df)[order(Year), Year := Year[1] , by = 'Code-2']
df
# Code-1 Type Year Code-2
#1: AB1034510 Type-A 2013 501324
#2: AB1034927 Type-C 2013 501324
#3: AB1039701 Type-B 1998 501325
#4: AB1036802 Type-D 1998 501325
#5: AB1031649 Type-F 2016 501328
如果我们需要dplyr
解决方案
library(dplyr)
df %>%
group_by(`Code-2`) %>%
arrange(Year) %>%
mutate(Year = first(Year))
df <- structure(list(`Code-1` = c("AB1034510", "AB1034927", "AB1039701",
"AB1036802", "AB1031649"), Type = c("Type-A", "Type-C", "Type-B",
"Type-D", "Type-F"), Year = c(2014L, 2013L, 2012L, 1998L, 2016L
), `Code-2` = c(501324L, 501324L, 501325L, 501325L, 501328L)),
.Names = c("Code-1",
"Type", "Year", "Code-2"), class = "data.frame",
row.names = c(NA, -5L))