我的数据框架如下所示:
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但是这个dataframe有大约450万行,有12列。
我试图运行一个for循环,以便能够找到具有相同代码-2值的行,并从这些行中找到最古老的年份。然后,将最古老的年份分配给具有相同代码-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
}但似乎要么我做错了什么,要么运行代码花费了太长时间。
有什么可以帮忙的吗?
发布于 2016-06-24 09:30:45
使用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发布于 2016-06-24 09:30:52
我们可以使用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))https://stackoverflow.com/questions/38009915
复制相似问题