如何在R中创建一个新列,该列匹配来自两个不同数据帧的多个值

如何在R中创建一个新列,该列匹配来自两个不同数据帧的多个值,r,R,我有两个数据帧和数千个变量 一个是不同年龄的学生和评价他们的不同老师。所有教师都对多个不同的学生进行了评估,但不是每个学生都进行了评估 Teacher Student Age 0123 1 7 0145 1 7 0163 1 7 0175 2 8 0123 2 8 0194 2 8 0123 3 7 0145 3 7 然后我有老师对不同年龄段的特定刻

我有两个数据帧和数千个变量

一个是不同年龄的学生和评价他们的不同老师。所有教师都对多个不同的学生进行了评估,但不是每个学生都进行了评估

Teacher Student Age
0123    1       7
0145    1       7
0163    1       7
0175    2       8
0123    2       8
0194    2       8
0123    3       7 
0145    3       7
然后我有老师对不同年龄段的特定刻板印象的评分。每个老师对每个年龄组的刻板印象进行评分。数据框如下所示

Teacher Age 7   Age 8  Age 9
0123    1       1      1
0145    5       7      3
0163    4       7      1
0175    6       8      1
0183    3       8      1
0194    2       8      1
0120    3       7      4
我想在第一个数据框中创建一个新的列,其中每行中的教师都是匹配的,值是他们的刻板印象反应,取决于每个学生的年龄。例如,在这个新列中,第一行的值是123老师对7岁儿童的刻板印象反应。在这种情况下,这是一个1

非常感谢你的帮助。我是R的新手,我不知道从哪里开始

编辑:我希望输出如下所示:

Teacher Student Age AgeStereotype
0123    1       7   1
0145    1       7   5
0163    1       7   4
0175    2       8   8
0123    2       8   1
0194    2       8   8
0123    3       7   1
0145    3       7   5

另一种
base
方式:

merge(
  df1,
  data.frame(Teacher = df2$Teacher, 
             Age = gsub("[[:alpha:]]", "", stack(df2[,-1])[,2]),
             AgeStereotype = stack(df2[,-1])[,1]
  )
)
输出:

  Teacher Student Age AgeStereotype
1     123       1   7             1
2     145       1   7             5
3     163       1   7             4
4     175       2   8             8
5     123       2   8             1
6     194       2   8             8
7     123       3   7             1
8     145       3   7             5
  Teacher Age Student AgeStereotype
1     123   7       1             1
2     123   7       3             1
3     123   8       2             1
4     145   7       1             5
5     145   7       3             5
6     163   7       1             4
7     175   8       2             8
8     194   8       2             8
不过,这确实改变了原始顺序,即使可以在不增加附加包的情况下修改此顺序,如果重要的话,也许最简单的方法是让
dplyr
进行连接:

dplyr::left_join(
  df1,
  data.frame(Teacher = df2$Teacher, 
             Age = as.integer(gsub("[[:alpha:]]", "", stack(df2[,-1])[,2])),
             AgeStereotype = as.integer(stack(df2[,-1])[,1]), stringsAsFactors = FALSE
  )
)

您可以使用
[
即:

transform(df1,AgeStereotype = `rownames<-`(df2,df2$Teacher)[cbind(Teacher,paste("Age",Age))])

  Teacher Student Age AgeStereotype
1     123       1   7             1
2     145       1   7             5
3     163       1   7             4
4     175       2   8             8
5     123       2   8             1
6     194       2   8             8
7     123       3   7             1
8     145       3   7             5
transform(df1,AgeStereotype=`rownames
通过将第二个数据帧转换为
一个长数据帧,然后将其连接到第一个数据帧。
在
R
中有很多方法可以实现这一点,下面是一个干净的方法 在
tidyverse
中,特别是使用
dplyr
tidyr
功能

#重新创建数据
df1加入,由=c(“教师”、“年龄”)
#>#A tibble:8 x 4
#>师生年龄刻板印象
#>                  
#> 1 0123          1     7             1
#> 2 0145          1     7             5
#> 3 0163          1     7             4
#> 4 0175          2     8             8
#> 5 0123          2     8             1
#> 6 0194          2     8             8
#> 7 0123          3     7             1
#> 8 0145          3     7             5

您能否显示预期的output@akrun我只是编辑它以显示所需的输出。
transform(df1,AgeStereotype = `rownames<-`(df2,df2$Teacher)[cbind(Teacher,paste("Age",Age))])

  Teacher Student Age AgeStereotype
1     123       1   7             1
2     145       1   7             5
3     163       1   7             4
4     175       2   8             8
5     123       2   8             1
6     194       2   8             8
7     123       3   7             1
8     145       3   7             5