我有一个示例数据框
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
答案 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