首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据另一个数据帧中的值引用一个数据帧中的值?

如何根据另一个数据帧中的值引用一个数据帧中的值?
EN

Stack Overflow用户
提问于 2012-10-17 16:20:41
回答 2查看 1.5K关注 0票数 0

我对R是新手,在处理一些环境监测数据时,我对这个问题感到困惑。

我有两个数据集,分别记录了实际的监控时间序列和监控站点的信息.我将它们存储在两个数据帧中-- monitoringsites

monitoring:

代码语言:javascript
复制
                  date       site obs
 1 2001-01-01 10:00:00  riverside  NA
 2 2001-01-01 11:00:00  riverside  52
 3 2001-01-01 12:00:00  riverside  52
 4 2001-01-01 13:00:00  riverside  56
 5 2001-01-01 10:00:00       dorm  52
 6 2001-01-01 11:00:00       dorm  64
 7 2001-01-01 12:00:00       dorm  76
 8 2001-01-01 13:00:00       dorm  80
 9 2001-01-01 10:00:00        kfc  78
10 2001-01-01 11:00:00        kfc  74
11 2001-01-01 12:00:00        kfc  66
12 2001-01-01 13:00:00        kfc  68

sites:

代码语言:javascript
复制
        site       type
 1      DORM   suburban
 2       KFC      urban
 3 RIVERSIDE      rural

我想在monitoring中添加一个monitoring列,其中包含从sites提取的信息,如下所示:

代码语言:javascript
复制
                  date       site obs site.type
 1 2001-01-01 10:00:00  riverside  NA     rural
 2 2001-01-01 11:00:00  riverside  52     rural
 3 2001-01-01 12:00:00  riverside  52     rural
 4 2001-01-01 13:00:00  riverside  56     rural
 5 2001-01-01 10:00:00       dorm  52  suburban
 6 2001-01-01 11:00:00       dorm  64  suburban
 7 2001-01-01 12:00:00       dorm  76  suburban
 8 2001-01-01 13:00:00       dorm  80  suburban
 9 2001-01-01 10:00:00        kfc  78     urban
10 2001-01-01 11:00:00        kfc  74     urban
11 2001-01-01 12:00:00        kfc  66     urban
12 2001-01-01 13:00:00        kfc  68     urban

我在下面的命令中尝试了grep()

代码语言:javascript
复制
for (i in 1:nrow(monitoring)) {
  monitoring$site.type[i] <- as.character(sites$type[grep(monitoring$site[i], sites$site, ignore.case = T)])
}

它在这个小的monitoring示例集上运行得很好。然而,当我把它应用到我的真实数据集时,有654,525条记录,它从未停止在我的i5-2400计算机上运行,内存为16 GB .

我试图在堆栈溢出上搜索现有的问题,并找到了一些答案,为类似的场景提供了相同的解决方案,因此更让人困惑的是,为什么它在我的情况下不起作用。因此,

  1. 有人能指出问题出在哪里吗?
  2. 我可以问一下在这种情况下如何避免for循环,因为它可能不那么“时尚”和高效?)

在此之前,非常感谢您。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-17 16:55:02

正确的方法是使用merge,就像Ben建议的那样,但是这里有一个简单的技巧:

代码语言:javascript
复制
rownames( sites ) <- tolower( sites$site )

现在您可以使用键(如sites )访问riverside,例如尝试sites[ "riverside", ]tolower()函数仅用于将RIVERSIDE转换为riverside。因此,你可以

代码语言:javascript
复制
monitoring$site.type <- sites[ monitoring$site, "type" ]
票数 3
EN

Stack Overflow用户

发布于 2012-10-17 18:15:57

按照Ben的建议使用merge很容易

代码语言:javascript
复制
monitoring
sites$site <- factor(tolower(sites$site)) # cols are unordered

merge(monitoring, sites, by='site')

# fixing col order...
merge(monitoring, sites, by='site')[,c('date', 'site', 'obs', 'type')] 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12938798

复制
相关文章

相似问题

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