如何在R语言数据框中按行号匹配放置列元素值
问题描述
我用以下R代码生成了一个带随机NA的10×10数据框:
data <- replicate(10,sample(0:9,10,rep=FALSE)) ind <- which(data %in% sample(data, 5)) # 把这些位置替换为NA data[ind]<-NA # 得到含15个随机NA的数据框 data = as.data.frame(data) rownames(data) = 1:10 colnames(data) = 1:10 data
现在需要重新排列数据框的元素:对于每个数值型元素,将它放到行号-1等于该元素值的位置(即元素值为v时,放到第v+1行),没有匹配值的行填充NA。尝试过排序填充NA的方法,但不符合需求,该怎么实现?
解决方案
可以通过对每一列单独处理,为每个行号匹配对应的值,具体代码如下:
# 定义处理单列的函数 rearrange_col <- function(col) { # 行号1-10对应要匹配的目标值为0-9(行号-1) target_vals <- 0:9 # 遍历每个目标值,存在则保留,否则填NA sapply(target_vals, function(v) { matched_val <- col[col == v] if (length(matched_val) > 0) matched_val else NA }) } # 对原数据框的每一列应用处理函数,生成新数据框 new_data <- as.data.frame(lapply(data, rearrange_col)) # 保持原数据框的行列名 rownames(new_data) <- rownames(data) colnames(new_data) <- colnames(data) new_data
代码说明
rearrange_col函数:针对单个列,遍历0到9(对应行号1到10的行号-1),如果列中存在该值就保留,不存在则填充NA。lapply(data, rearrange_col):批量处理原数据框的所有列,再转为数据框,得到符合要求的结果。
内容的提问来源于stack exchange,提问作者MK Huda
相关产品推荐
相关产品推荐

