2017-08-24 139 views
1

如果这是一个重复的问题,我有一种感觉,但我会提供一个很好的示例来帮助理解这一点。第一演示dataframes:使用R中的2列映射数据框来更改主数据框中的值

> map_df = data.frame(name = c('nick', 'mike', 'joe', 'tom'), id = c(1, 2, 3, 4), stringsAsFactors = FALSE) 
> main_df = data.frame(P1 = c('nick', 'mike', 'nick', 'mike', 'nick', 'mike', 'joe', 'tom'), 
        P2 = c('joe', 'tom', 'joe', 'tom', 'joe', 'tom', 'nick', 'mike'), 
        stringsAsFactors = FALSE) 

> map_df 
    name id 
1 nick 1 
2 mike 2 
3 joe 3 
4 tom 4 

> main_df 
    P1 P2 
1 nick joe 
2 mike tom 
3 nick joe 
4 mike tom 
5 nick joe 
6 mike tom 
7 joe nick 
8 tom mike 

通过上面的数据,我的问题/期望的输出是简单的。我想用main关联的id替换main_df中的所有值。我想要以下输出数据帧:

> output_df 
    P1 P2 
1 1 3 
2 2 4 
3 1 3 
4 2 4 
5 1 3 
6 2 4 
7 3 1 
8 4 2 

在此先感谢您的帮助!

回答

3

我们可以使用match。遍历与lapplymatch以“map_df”“姓名”柱,并用数字指标的值的变化,以在“map_df”对应的“ID”的列,输出分配给“main_df”

main_df[] <- lapply(main_df, function(x) map_df$id[match(x, map_df$name)]) 

或将其转换为matrix和与之相匹配的

main_df[] <- setNames(map_df$id, map_df$name)[as.matrix(main_df)] 
+1

谢谢你这是完美的,使用匹配功能在这里很合适 – Canovice

1

另一种方法是使用你的map_df作为查表。

rownames(map_df) = map_df$name 
main_df$P1 = map_df[main_df$P1, "id"] 
main_df$P2 = map_df[main_df$P2, "id"] 
相关问题