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

如何基于R语言DataFrame按SentenceID生成向量列表并实现序列填充?

搞定分组向量提取与填充的方案

嘿,这个需求其实很简单,分两步就能完美实现,先从你的原始数据开始:

首先是你提供的DataFrame生成代码(方便我们复现场景):

SentenceID = c(1,1,1,1,2,2,2,3,3,3,3,3,3,3,3)
Tokens = c("I","went","to","school","nobody","can","find","some","people","know","what","they","are","doing","now")
WordIndex = c(3,4,7,8,9,10,12,54,34,66,33,89,87,23,22)
df = data.frame(SentenceID, Tokens, WordIndex)

接下来分两步完成你的目标:

第一步:按SentenceID生成WordIndex的向量列表

用基础R的split()函数就能直接搞定,这是最简洁的方式:

# 按SentenceID拆分WordIndex列,得到初始列表X
X <- split(df$WordIndex, df$SentenceID)

运行之后,你就能得到预期的初始列表:

X
[[1]]
[1] 3 4 7 8

[[2]]
[1]  9 10 12

[[3]]
[1] 54 34 66 33 89 87 23 22

第二步:把每个向量填充0至10个元素

我们可以先写个小函数来处理单个向量的补全,然后用lapply()遍历整个列表:

# 定义补全函数:将向量补到指定长度(这里是10),不足的部分填0
pad_to_length <- function(vec, target_length = 10) {
  # 先判断原向量长度,如果超过目标长度可以选择截断(你的例子里都没超,这步可选)
  if (length(vec) > target_length) {
    return(vec[1:target_length])
  } else {
    # 拼接原向量和足够的0
    return(c(vec, rep(0, target_length - length(vec))))
  }
}

# 给列表X的每个元素应用补全函数
X_padded <- lapply(X, pad_to_length)

运行后就得到你想要的填充结果:

X_padded
[[1]]
 [1] 3 4 7 8 0 0 0 0 0 0

[[2]]
 [1]  9 10 12  0  0  0  0  0  0  0

[[3]]
 [1] 54 34 66 33 89 87 23 22  0  0

要是你觉得写函数麻烦,也可以用一行代码直接搞定填充,更简洁:

X_padded <- lapply(X, function(x) c(x, rep(0, max(0, 10 - length(x)))))

这个和上面的函数效果完全一致。

另外,如果你习惯用tidyverse工具链(dplyr + purrr),也可以这么写:

library(dplyr)
library(purrr)

X_padded <- df %>%
  group_by(SentenceID) %>%
  summarise(vec = list(WordIndex)) %>%
  mutate(vec = map(vec, ~c(.x, rep(0, max(0, 10 - length(.x)))))) %>%
  pull(vec)

这个方法更贴合tidyverse的工作流,结果也是一样的。

不管用哪种方法,都能精准实现你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:37:52