首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在处理大型数据帧时如何在R中更快地运行for循环

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

Stack Overflow用户
提问于 2016-06-24 09:24:10
回答 2查看 105关注 0票数 0

我的数据框架如下所示:

代码语言:javascript
复制
  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值的行。所以看起来是这样的:

代码语言:javascript
复制
 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

为了完成这个过程,我尝试了下面的代码:

代码语言:javascript
复制
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
}

但似乎要么我做错了什么,要么运行代码花费了太长时间。

有什么可以帮忙的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-24 09:30:45

使用data.table。它又快又简单。

代码语言:javascript
复制
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']

以前的数据:

代码语言:javascript
复制
      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

之后:

代码语言:javascript
复制
      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
EN

Stack Overflow用户

发布于 2016-06-24 09:30:52

我们可以使用data.table

代码语言:javascript
复制
 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解决方案

代码语言:javascript
复制
 library(dplyr)
 df %>%
   group_by(`Code-2`) %>% 
   arrange(Year) %>% 
   mutate(Year = first(Year))

数据

代码语言:javascript
复制
 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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38009915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档