You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用mutate()从另一数据框按行列索引添加新列?

解决从df2按索引提取值到df1的tidy风格方案

我明白你遇到的问题了——直接在mutate里用df2[Row_no, Col_no]会返回一个矩阵,而mutate需要和df1行数完全匹配的向量,这就是你看到长度不匹配错误的原因。下面给你两种适合大数据量的tidy风格解决方案:

方法1:用purrr::map2_dbl逐行匹配(最贴合tidyverse管道风格)

利用purrr的map2函数,可以同时迭代Row_no和Col_no两列,逐行从df2中提取对应位置的值,最后返回一个数值向量给mutate:

library(tidyverse)

# 你的示例数据(设置随机种子方便复现结果)
set.seed(123)
df1 <- data.frame(Row_no = c(1,2,3,4, 1,2,3,4), 
                  Col_no = c(1,1,2,2,3,3,4,4), 
                  Size = sample(200:300, 8))
df2 <- cbind(rnorm(8), rnorm(8), rnorm(8), rnorm(8), rnorm(8), rnorm(8), rnorm(8), rnorm(8))

# 新增Value列的tidy解决方案
df1 <- df1 %>%
  mutate(Value = map2_dbl(Row_no, Col_no, ~ df2[.x, .y]))

# 查看结果
df1

方法2:向量化矩阵索引(更高效,适合超大数据量)

如果你的数据量特别大,向量化操作的速度会比逐行迭代更快。我们可以用cbind把Row_no和Col_no组合成矩阵索引,直接从df2中提取所有对应值:

df1 <- df1 %>%
  mutate(Value = df2[cbind(Row_no, Col_no)])

这个方法本质上是利用了R中矩阵的索引规则,cbind(Row_no, Col_no)生成一个n行2列的矩阵,每一行代表一个位置的行号和列号,df2[这个矩阵]会直接返回一个长度为n的向量,完美匹配df1的行数。

验证结果

两种方法都会得到你想要的结果:新增的Value列里,每一行都是df2中对应Row_no和Col_no位置的数值。比如设置随机种子后,第一行的Value就是df2[1,1]的值,第二行是df2[2,1],以此类推。

内容的提问来源于stack exchange,提问作者Lotte Victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:15:08