使用另一个数据帧的值匹配数据框的rownumber和列名称

时间:2018-01-24 01:21:58

标签: r dataframe

我有一个示例数据框

samp_df <- data.frame(x1=c(1,3,5,7,9),x2=c(2,4,6,8,10))

> samp_df
  x1 x2
1  1  2
2  3  4
3  5  6
4  7  8
5  9 10

我有另一个包含变量str和sis_str

的数据框
samp2_df <- data.frame(str=c(x1,x1,x2,x2,x1),sis_str=c(1,2,4,5,3))

> samp2_df
  str sis_str
1   x1       1
2   x1       2
3   x2       4
4   x2       5
5   x1       3

目标是在samp2_df数据框中创建另一个变量“sim”,其中包含来自samp_df的值,这样变量sis_str应该匹配第一个数据框的行名,而变量str应该匹配第一个数据框的列名。第一个数据框

所以输出应该是

> samp2_df
  str sis_str  sim
1   1       1   1
2   1       2   3
3   2       4   8
4   2       5   10
5   1       3   5

2 个答案:

答案 0 :(得分:2)

我认为使用两列矩阵作为&#34; [&#34;如果这是一个任何规模的问题会更快。有关此策略的更多信息,请参阅?"["

samp_df[ cbind(samp2_df$sis_str, as.numeric(samp2_df$str)) ]
[1]  1  3  8 10  5

然后只需cbind到samp2_df:

cbind(samp2_df, sim=samp_df[ cbind(samp2_df$sis_str, as.numeric(samp2_df$str)) ] )
  str sis_str sim
1  x1       1   1
2  x1       2   3
3  x2       4   8
4  x2       5  10
5  x1       3   5

:编辑:如果相反,任务是匹配rownames而不是&#34;数字&#34; (我把它当作整数索引)然后这会成功:

cbind(samp2_df, sim2=samp_df[ cbind(match(samp2_df$sis_str,rownames(samp_df)),
                                    as.numeric(samp2_df$str)) ] )
  str sis_str sim sim2
1   1       1   1    1
2   1       2   3    3
3   2       4   8    8
4   2       5  10   NA
5   1      23  NA    9

答案 1 :(得分:1)

我不确定是否有更好的方法,但一种方法是使用mapply。我们创建一个行列对值,从samp_df中提取,其中行值为samp2_df$sis_str,列值为samp2_df$str中的数字部分,我们通过将字符值替换为空字符串("")。

samp2_df$sim <- mapply(function(x, y) samp_df[x, y], 
               samp2_df$sis_str, as.numeric(sub("[a-zA-Z]+", "", samp2_df$str)))

samp2_df
#  str sis_str sim
#1  x1       1   1
#2  x1       2   3
#3  x2       4   8
#4  x2       5  10
#5  x1       3   5