我对R是新手,在处理一些环境监测数据时,我对这个问题感到困惑。
我有两个数据集,分别记录了实际的监控时间序列和监控站点的信息.我将它们存储在两个数据帧中-- monitoring和sites
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 68sites:
site type
1 DORM suburban
2 KFC urban
3 RIVERSIDE rural我想在monitoring中添加一个monitoring列,其中包含从sites提取的信息,如下所示:
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计算机上运行,内存为16 GB .
我试图在堆栈溢出上搜索现有的问题,并找到了一些答案,为类似的场景提供了相同的解决方案,因此更让人困惑的是,为什么它在我的情况下不起作用。因此,
for循环,因为它可能不那么“时尚”和高效?)在此之前,非常感谢您。
发布于 2012-10-17 16:55:02
正确的方法是使用merge,就像Ben建议的那样,但是这里有一个简单的技巧:
rownames( sites ) <- tolower( sites$site )现在您可以使用键(如sites )访问riverside,例如尝试sites[ "riverside", ]。tolower()函数仅用于将RIVERSIDE转换为riverside。因此,你可以
monitoring$site.type <- sites[ monitoring$site, "type" ]发布于 2012-10-17 18:15:57
按照Ben的建议使用merge很容易
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')] https://stackoverflow.com/questions/12938798
复制相似问题