R语言:如何对列表中矩阵的指定列进行随机打乱?
解决列表中矩阵指定列的打乱赋值问题
问题描述
你有一个包含3个矩阵的列表lst,希望打乱每个矩阵的第3列数值,目前写出了代码:
lapply(lst, \(x) sample(x[,3]))
但不知道如何将抽样后的列赋值回原矩阵。
补充的dput(lst)输出:
list(structure(c(284.190191328526, 275.720694586635, 277.151402309537, 251.027558222413, 260.092776268721, 261.799371317029, 259.013641774654, 268.970000296831, 270.491042807698, 281.670583188534, 277.505417019129, 278.831141069531, 265.090487375855, 259.860835596919, 259.975585192442, 283.792229965329, 278.662678897381, 279.944456294179, 282.146671935916, 279.153416529298, 280.239875465631, 270.852381959558, 270.976897478104, 271.836298704147, 243.119602054358, 248.854640349746, 250.075380727649, 283.831293657422, 277.869197651744, 279.148533567786, 0, 0, 0), dim = c(3L, 11L), dimnames = list(NULL, c("", "", "", "", "", "", "", "", "", "", "gt"))), structure(c(280.91616563499, 283.042695373297, 277.835016921163, 264.65102083981, 255.473494678736, 259.733878597617, 272.373424470425, 265.356608778238, 268.645283356309, 282.002624571323, 282.229682281613, 279.619739353657, 261.796929836273, 262.465895563364, 261.965392008424, 283.360087871552, 283.860591426492, 281.140781864524, 283.106173872948, 283.616443350911, 281.421552151442, 272.81289100647, 273.41837823391, 272.446668893099, 252.778099924326, 245.238807350397, 249.279458001256, 282.945036143064, 283.142796084285, 280.068971812725, 1, 0, 0), dim = c(3L, 11L), dimnames = list(NULL, c("", "", "", "", "", "", "", "", "", "", "gt"))), structure(c(286.072572991252, 279.421979412436, 276.038087084889, 267.942136898637, 256.398815885186, 266.247749254107, 274.289986863732, 266.313669234514, 270.246894732118, 285.440229475498, 280.703756809235, 275.937986373901, 265.036774799228, 262.966399118304, 256.784569844604, 286.931974217296, 282.256538569927, 276.66066467762, 286.971037909389, 281.526535823941, 277.053743079305, 275.339823588729, 271.836298704147, 268.73805962503, 258.627887815237, 243.874019607902, 257.033600881696, 285.703909397125, 282.119815647602, 275.972167104483, 0, 1, 0), dim = c(3L, 11L), dimnames = list(NULL, c("", "", "", "", "", "", "", "", "", "", "gt"))))
解决方案
你的原代码仅返回了打乱后的第3列,未修改并返回完整矩阵。要实现需求,需在lapply的匿名函数中修改矩阵的目标列,再返回完整矩阵:
方法1:用lapply创建新列表
# 生成打乱第3列后的新列表 lst_shuffled <- lapply(lst, function(x) { x[, 3] <- sample(x[, 3]) # 将打乱后的列赋值回原矩阵的第3列 x # 返回修改后的完整矩阵 })
方法2:原地修改原列表(for循环)
如果不需要保留原列表,可直接用循环原地修改:
for (i in seq_along(lst)) { lst[[i]][, 3] <- sample(lst[[i]][, 3]) }
关键说明
sample(x[,3])会随机打乱第3列的元素顺序(默认不重复抽样)- 在
lapply中必须返回修改后的完整矩阵,而非仅打乱后的列,这样lapply才能生成包含完整矩阵的新列表 - 若要指定其他列,只需将代码中的
3替换为目标列的索引即可
内容的提问来源于stack exchange,提问作者user21573410
相关产品推荐
相关产品推荐

