0

我是 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  68

sites:

        site       type
 1      DORM   suburban
 2       KFC      urban
 3 RIVERSIDE      rural

我想在其中添加一site.type列,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 条记录的真实数据集时,它从未停止在具有 16 GB RAM 的 i5-2400 计算机上运行......

我尝试在 stackoverflow 上搜索现有问题,并确实找到了一些为类似场景提供相同解决方案的答案,因此更加困惑为什么它在我的情况下不起作用。所以,

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

提前谢谢了。

4

2 回答 2

3

正如本建议的那样,正确的做法是使用merge,但这里有一个简单的技巧:

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

现在您可以sites使用诸如riversidetry之类的键进行访问sites[ "riverside", ]。该tolower()功能仅用于RIVERSIDE变成riverside. 因此,你可以做

monitoring$site.type <- sites[ monitoring$site, "type" ]
于 2012-10-17T16:55:02.543 回答
1

按照 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')] 
于 2012-10-17T18:15:57.373 回答