R 使用map和fcase更新嵌套列表的元素

R 使用map和fcase更新嵌套列表的元素,r,data.table,purrr,R,Data.table,Purrr,我想使用purrr:map()和purrr:pull()将数据.table::fcase()规则应用于嵌套列表中的元素,并通过引用更新列表 我可以使用dplyr::mutate()完成一个工作输出,但是这个输出是一个不需要的格式,并且不会像数据那样通过引用进行更新。表:=会更新 可复制示例 library(purrr) library(data.table) library(dplyr) df <- list(out1 = list(e1 = c(1, 2, 3), e2 = c(TRU

我想使用
purrr:map()
purrr:pull()
数据.table::fcase()
规则应用于嵌套列表中的元素,并通过引用更新列表

我可以使用
dplyr::mutate()
完成一个工作输出,但是这个输出是一个不需要的格式,并且不会像
数据那样通过引用进行更新。表
:=
会更新

可复制示例

library(purrr)
library(data.table)
library(dplyr)

df <- list(out1 = list(e1 = c(1, 2, 3), e2 = c(TRUE, FALSE, TRUE), 
    parm = list(a = structure(list(V1 = c(515L, 228L, 232L, 219L, 
    597L), V2 = c(628L, 454L, 889L, 769L, 783L), V3 = c(798L, 
    789L, 294L, 566L, 591L), V4 = c(480L, 198L, 749L, 543L, 119L
    ), V5 = c(311L, 141L, 286L, 225L, 449L), V6 = c(712L, 812L, 
    930L, 501L, 286L), V7 = c(329L, 907L, 880L, 635L, 442L), 
        V8 = c(721L, 373L, 299L, 713L, 302L)), class = "data.frame", row.names = c(NA, 
    -5L)), b = structure(list(V1 = c(664L, 495L, 429L, 169L, 
    506L), V2 = c(795L, 207L, 452L, 931L, 759L), V3 = c(803L, 
    477L, 982L, 889L, 641L), V4 = c(411L, 802L, 595L, 216L, 721L
    ), V5 = c(540L, 301L, 931L, 399L, 628L), V6 = c(367L, 811L, 
    261L, 297L, 754L), V7 = c(417L, 600L, 260L, 948L, 685L), 
        V8 = c(855L, 522L, 612L, 274L, 356L), flag = c(0, 0, 
        0, 0, 0)), class = "data.frame", row.names = c(NA, -5L
    )), stand = structure(list(V1 = c(105L, 157L, 244L, 400L, 
    982L), V2 = c(838L, 894L, 793L, 525L, 272L), V3 = c(203L, 
    300L, 707L, 815L, 367L), V4 = c(148L, 189L, 490L, 396L, 290L
    ), V5 = c(672L, 924L, 599L, 780L, 160L), V6 = c(158L, 651L, 
    879L, 598L, 688L), V7 = c(930L, 162L, 996L, 162L, 255L), 
        V8 = c(230L, 731L, 765L, 695L, 145L), flag = c(0, 0, 
        0, 0, 0)), class = "data.frame", row.names = c(NA, -5L
    )))), out2 = list(e1 = c(3, 4, 5), e2 = c(TRUE, FALSE, TRUE
), parm = list(a = structure(list(V1 = c(253L, 179L, 994L, 441L, 
775L), V2 = c(257L, 877L, 273L, 838L, 467L), V3 = c(398L, 738L, 
348L, 421L, 284L), V4 = c(637L, 960L, 126L, 401L, 439L), V5 = c(796L, 
695L, 537L, 847L, 680L), V6 = c(212L, 855L, 565L, 843L, 265L), 
    V7 = c(529L, 560L, 360L, 213L, 638L), V8 = c(143L, 165L, 
    656L, 106L, 352L)), class = "data.frame", row.names = c(NA, 
-5L)), b = structure(list(V1 = c(832L, 929L, 785L, 193L, 359L
), V2 = c(512L, 567L, 618L, 512L, 513L), V3 = c(955L, 512L, 182L, 
124L, 565L), V4 = c(172L, 142L, 269L, 144L, 551L), V5 = c(432L, 
267L, 503L, 956L, 635L), V6 = c(159L, 894L, 175L, 504L, 553L), 
    V7 = c(112L, 793L, 411L, 674L, 135L), V8 = c(919L, 254L, 
    733L, 189L, 772L), flag = c(0, 0, 0, 0, 0)), class = "data.frame", row.names = c(NA, 
-5L)), stand = structure(list(V1 = c(370L, 789L, 898L, 255L, 
574L), V2 = c(417L, 595L, 595L, 986L, 650L), V3 = c(324L, 774L, 
377L, 704L, 125L), V4 = c(860L, 290L, 668L, 343L, 287L), V5 = c(466L, 
108L, 964L, 437L, 686L), V6 = c(173L, 214L, 229L, 856L, 740L), 
    V7 = c(700L, 167L, 361L, 186L, 524L), V8 = c(329L, 951L, 
    405L, 659L, 316L), flag = c(0, 0, 0, 0, 0)), class = "data.frame", row.names = c(NA, 
-5L)))), out3 = list(e1 = c(1, 2, 3), e2 = c(TRUE, FALSE, TRUE
), parm = list(a = structure(list(V1 = c(867L, 773L, 261L, 944L, 
674L), V2 = c(176L, 775L, 840L, 605L, 816L), V3 = c(936L, 392L, 
694L, 119L, 794L), V4 = c(874L, 780L, 840L, 809L, 517L), V5 = c(943L, 
821L, 612L, 184L, 336L), V6 = c(240L, 621L, 923L, 556L, 315L), 
    V7 = c(627L, 599L, 447L, 128L, 306L), V8 = c(690L, 799L, 
    989L, 151L, 752L)), class = "data.frame", row.names = c(NA, 
-5L)), b = structure(list(V1 = c(684L, 666L, 209L, 736L, 323L
), V2 = c(658L, 571L, 537L, 614L, 109L), V3 = c(198L, 548L, 858L, 
961L, 947L), V4 = c(920L, 912L, 698L, 131L, 566L), V5 = c(943L, 
593L, 646L, 183L, 413L), V6 = c(364L, 997L, 679L, 758L, 328L), 
    V7 = c(313L, 808L, 298L, 540L, 563L), V8 = c(220L, 901L, 
    258L, 439L, 246L), flag = c(0, 0, 0, 0, 0)), class = "data.frame", row.names = c(NA, 
-5L)), stand = structure(list(V1 = c(892L, 221L, 103L, 518L, 
603L), V2 = c(332L, 753L, 354L, 504L, 799L), V3 = c(190L, 714L, 
416L, 780L, 576L), V4 = c(481L, 938L, 192L, 540L, 869L), V5 = c(568L, 
301L, 900L, 201L, 187L), V6 = c(836L, 222L, 478L, 209L, 569L), 
    V7 = c(105L, NA, 998L, 896L, 905L), V8 = c(414L, 676L, NA, 
    183L, 643L), flag = c(0, 0, 0, 0, 0)), row.names = c(NA, 
-5L), class = "data.frame"))))
我想这样使用
:=
来完成,但是如果可能的话,在整个列表中使用
map()
在更大的嵌套结构中通过引用进行更新。或者如果有其他方法来实现这一点

df2 <- df$out3$parm$stand
setDT(df2)[, flag := data.table::fcase(is.na(V8), 9L, V8 < 500, 3L, V7 > 500, 2L, default = 1L)][]
    V1  V2  V3  V4  V5  V6  V7  V8 flag
1: 892 332 190 481 568 836 105 414    3
2: 221 753 714 938 301 222  NA 676    1
3: 103 354 416 192 900 478 998  NA    9
4: 518 504 780 540 201 209 896 183    3
5: 603 799 576 869 187 569 905 643    2
DF2500,2L,默认值=1L)][]
V1 V2 V3 V5 V6 V7 V8标志
1: 892 332 190 481 568 836 105 414    3
2:221 753 714 938 301 222 NA 676 1
3:103 354 416 192 900 478 998 NA 9
4: 518 504 780 540 201 209 896 183    3
5: 603 799 576 869 187 569 905 643    2

考虑更新对象,然后返回数据

df2 <- map(df, ~ {
    .x$parm$stand <- .x$parm$stand %>% 
        mutate(flag = data.table::fcase(is.na(V8), 9L,
                                   V8 < 500, 3L,
                    V7 > 500, 2L, default = 1L))
           .x
      } ) 
df2 500,2L,默认值=1L))
.x
} ) 

这很有道理。我最初是想找出一种方法,
左手
df2 <- map(df, ~ {
    .x$parm$stand <- .x$parm$stand %>% 
        mutate(flag = data.table::fcase(is.na(V8), 9L,
                                   V8 < 500, 3L,
                    V7 > 500, 2L, default = 1L))
           .x
      } )