2012-10-17 101 views
0

我是R新手,在操作某些环境监控数据时,对此问题感到困惑。如何根据另一个数据帧中的值引用一个数据帧中的值?

我有两个数据集分别记录实际监测时间序列和监测点信息。我将它们存储在两个数据帧monitoringsites

monitoring:

    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:

 site  type 
1  DORM suburban 
2  KFC  urban 
3 RIVERSIDE  rural 

我想在monitoring与来自sites提取信息添加site.type列如下所示:

    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()

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计算机上永不停止运行,内存为16GB RAM。同样的解决方案,以类似的情况,所以更加困惑为什么它不起作用在我的情况。因此,

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

非常感谢提前。

+0

'?merge'应该运行得更好...... –

+0

做那些2'data.frame's有相同的尺寸? – aL3xa

+0

@BenBolker谢谢你指点我正确的方向 - 如果匹配的列有不同的大写内容(请参阅下面的@ 1月份的解决方案),是否有任何一步解决方案来“合并”两者? – elarry

回答

3

正确的方式做它是使用merge,因为本建议,但这里是一个简单的一招:

rownames(sites) <- tolower(sites$site) 

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

monitoring$site.type <- sites[ monitoring$site, "type" ] 
+0

有多聪明!非常感谢这个好主意 - 读了@Ben的建议,并试图在两个“site”列中匹配案例(真实的“monitoring”中的site中的站点名称通常包含多个单词,是每个单词的首字母大写,比如'Williamson Park',我想保留这个格式输出)。在你的解决方案中,我把大写字母保存在'sites $ site'中,并使用'toupper(监视$ site)'来进行索引,并且它在一秒钟内就完美了!谢谢! :) – elarry

1

使用merge由Ben的建议很容易

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')] 
+0

感谢您的回答,@ jilber。我还认为,如果两个“网站”栏中的内容具有相同的大写字母,那么将两者合并将很容易。然而,在真正的“监测$站点”中,每个首字母大写,例如“Stratford-upon-Avon Centre”,而在真实的“sites $ site”中,全部都是大写,如示例中所示,并且我希望第一种格式的输出。只是为了测试,我只将两列转换为小字母,并使用'site'的'merge'。在生成的数据框中,时间序列不再按顺序排列。任何想法为什么?非常感谢。 – elarry

相关问题