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的建议,并试图在站点
两个专栏中匹配
案例(在realmonitoring
中的site
中的站点名称通常有多个单词,每个单词的首字母大写,例如Williamson Park
,我希望保留此格式以供输出)。在您的解决方案中,我保留了sites$site
中的大写字母,并使用了toupper(monitoring$site)
用于索引,它在一秒钟内就完美地工作了!谢谢!:)太聪明了!非常感谢这个伟大的想法-阅读了@Ben的建议,并试图在站点的两个专栏中匹配案例(在realmonitoring
中的site
中的站点名称通常有多个单词,每个单词的首字母大写,例如Williamson Park
,我希望保留此格式以供输出)。在您的解决方案中,我保留了sites$site
中的大写字母,并使用了toupper(monitoring$site)
用于索引,它在一秒钟内就完美地工作了!谢谢!:)谢谢你的回答,@jilber。我也认为如果两个站点
列中的内容都是相同的大写字母,那么合并这两个会很容易。但是,在real监控$site中,每个首字母都是大写的,例如雅芳中心斯特拉特福德
,而在real站点中,$site
都是大写的如示例所示,大写,我希望输出为第一种格式。只是为了测试,我将两列都转换为小写字母,并使用site
的merge
。在生成的数据框中,时间序列不再有序。知道为什么吗?再次感谢。谢谢你的回答,@jilber。我也认为是这样l易于合并
如果两个站点
列中的内容都是相同的资本化。但是,在real监控$site
中,每个首字母都是资本化的,例如雅芳中心斯特拉特福德
,而在real站点中,$site
都是资本化的,如示例所示,我希望第一种格式的输出。只是为了测试,我将两列都转换为小写字母,并使用site
的merge
。在生成的数据框中,时间序列不再有序。知道为什么吗?再次感谢。