如何在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