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

R 如何根据另一个数据帧中的值引用一个数据帧中的值?,r,pattern-matching,dataframe,R,Pattern Matching,Dataframe,我是个新手,在处理一些环境监测数据时,我对这个问题感到困惑 我有两个数据集,分别记录实际监测时间序列和监测地点信息。我将它们存储在两个数据框中监控和站点: 监控: 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

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

我有两个数据集,分别记录实际监测时间序列和监测地点信息。我将它们存储在两个数据框中
监控
站点

监控:

                  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
站点:

        site       type
 1      DORM   suburban
 2       KFC      urban
 3 RIVERSIDE      rural
我想添加一个
站点。在
监控
中键入
列,其中包含从
站点
提取的信息,如下所示:

                  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)])
}
for(1中的i:nrow(监控)){

监视$site.type[i]正确的方法是使用本建议的
merge
,但这里有一个简单的技巧:

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

正如Ben所建议的那样,正确的方法是使用
合并
,但这里有一个简单的技巧:

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

按照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')] 
监控

站点$site按照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')] 
监控

sites$site
?merge
应该能更好地工作…这两个
数据是否相同。frame
s具有相同的维度?@BenBolker感谢您为我指出了正确的方向-如果匹配的列具有不同的大写内容,是否有任何一步解决方案来合并这两个
呢(请参阅我在@一月的解决方案下面的评论)?aL3xa不,
监控
是654525乘8,
站点
是75乘2。
?合并
应该更好…这两个
数据。帧
具有相同的维度吗?@BenBolker感谢您为我指出了正确的方向-如果匹配的列是d,是否有一步解决方案来合并这两个不同的大写内容(见我下面的评论@Janur's Solution)?@aL3xa否,
监控
是654525乘8,
站点
是75乘2。多么聪明!非常感谢这个伟大的想法-阅读了@Ben的建议,并试图在
站点
两个专栏中
匹配
案例(在real
monitoring
中的
site
中的站点名称通常有多个单词,每个单词的首字母大写,例如
Williamson Park
,我希望保留此格式以供输出)。在您的解决方案中,我保留了
sites$site
中的大写字母,并使用了
toupper(monitoring$site)
用于索引,它在一秒钟内就完美地工作了!谢谢!:)太聪明了!非常感谢这个伟大的想法-阅读了@Ben的建议,并试图在
站点的两个
专栏中
匹配
案例(在real
monitoring
中的
site
中的站点名称通常有多个单词,每个单词的首字母大写,例如
Williamson Park
,我希望保留此格式以供输出)。在您的解决方案中,我保留了
sites$site
中的大写字母,并使用了
toupper(monitoring$site)
用于索引,它在一秒钟内就完美地工作了!谢谢!:)谢谢你的回答,@jilber。我也认为如果两个
站点
列中的内容都是相同的大写字母,那么合并这两个
会很容易。但是,在real
监控$site中,每个首字母都是大写的,例如雅芳中心斯特拉特福德
,而在real
站点中,$site
都是大写的如示例所示,大写,我希望输出为第一种格式。只是为了测试,我将两列都转换为小写字母,并使用
site
merge
。在生成的数据框中,时间序列不再有序。知道为什么吗?再次感谢。谢谢你的回答,@jilber。我也认为是这样l易于
合并
如果两个
站点
列中的内容都是相同的资本化。但是,在real
监控$site
中,每个首字母都是资本化的,例如雅芳中心斯特拉特福德
,而在real
站点中,$site
都是资本化的,如示例所示,我希望第一种格式的输出。只是为了测试,我将两列都转换为小写字母,并使用
site
merge
。在生成的数据框中,时间序列不再有序。知道为什么吗?再次感谢。