在处理大型数据帧时如何在R中更快地运行循环

时间:2016-06-24 09:24:11

标签: r

这就是我的数据框看起来像这样:

  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
}

但似乎我做错了或运行代码需要很长时间。

请帮忙吗?

2 个答案:

答案 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))