如何基于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
相关产品推荐
相关产品推荐

