【问题标题】:Adding a columnname and rowname into list elements in R将列名和行名添加到 R 中的列表元素中
【发布时间】:2018-07-26 21:21:57
【问题描述】:

我是一名成长中的 R 用户,需要帮助解决我撞到的墙。

我很难找到适合我的情况的解决方案。

我必须嵌套我需要连接在一起的列表

 ListA:
 [abc]:
 [1] 0 1 1 2
 [2] 2 0 4 5
 [3] 3 5 0 6
 [4] 2 3 1 0

 [def]
 [1] 0 4 2
 [2] 2 0 1
 [3] 1 1 0

 List B:
 [abc]:
 [1] 111 112 113 114

 [def]:
 [1] 222 223 224

这 2 个列表确实跨越 82 个表,格式相同,元素相同。这意味着我需要一个可扩展的代码,它不会手动定位每个列表或元素。

我想获取 ListB,并将其添加为 ListA 的第一列和第一行 >要么作为列/行名称,要么只是在数据本身中,如下所示:

 ListC:
 [abc]:
      111 112 113 114
 [111]  0   1   1   2
 [112]  2   0   4   5
 [113]  3   5   0   6
 [114]  2   3   1   0

 [def]:
      222 223 224
 [222]  0   4   2
 [223]  2   0   1
 [224]  1   1   0

我尝试了各种方法

 mapply(cbind, ListB,ListA, SIMPLIFY=FALSE)

 mapply(rbind, Listb,ListA, SIMPLIFY=FALSE)

我也试过

 lapply(ListA, function(x){
    names(x) <- ListB
    df
    })

还有

 Map(setNames, ListA, names(ListB))

以及这些代码的各种随机迭代。

有时我可以使用列名,但不适用于行名(反之亦然),因为“总向量大小”不一样。

我错过了什么?从将 82 个列表分成数据帧并手动处理它,(这根本不是动态的)我完全被难住了!

请让我知道我需要做什么才能完成这项工作

【问题讨论】:

    标签: r list merge


    【解决方案1】:

    考虑使用多行扩展您的函数调用。然后用用户定义的方法调用Map

    name_items <- function(elem, nm) {
       colnames(elem) <- nm
       rownames(elem) <- nm
    
       return(elem)
    }
    
    newListA <- Map(name_items, ListA, ListB)
    newListA <- mapply(name_items, ListA, ListB, SIMPLIFY=FALSE)   #  EQUIVALENT CALL
    

    【讨论】:

    • 或者,更难阅读的方式:Map(`dimnames&lt;-`, listA, lapply(listB, function(x) list(x,x)))
    【解决方案2】:

    包含生成示例数据的代码会有所帮助。无论如何,我使用purrr 来做到这一点。

    library(purrr)
    
    listA <- list(abc = matrix(c(0,2,3,2,1,0,5,3,1,4,0,1,2,5,6,0),4,4), def = matrix(c(0,2,1,4,0,1,2,1,0),3,3))
    listA
    #> $abc
    #>      [,1] [,2] [,3] [,4]
    #> [1,]    0    1    1    2
    #> [2,]    2    0    4    5
    #> [3,]    3    5    0    6
    #> [4,]    2    3    1    0
    #> 
    #> $def
    #>      [,1] [,2] [,3]
    #> [1,]    0    4    2
    #> [2,]    2    0    1
    #> [3,]    1    1    0
    
    listB <- list(abc = c(111,112,113,114), def = c(222,223,224))
    listB
    #> $abc
    #> [1] 111 112 113 114
    #> 
    #> $def
    #> [1] 222 223 224
    
    finalList <- map2(.x = listA, .y = listB, .f = function(.x, .y){
      rownames(.x) <- .y
      colnames(.x) <- .y
      return(.x)
    })
    
    finalList
    #> $abc
    #>     111 112 113 114
    #> 111   0   1   1   2
    #> 112   2   0   4   5
    #> 113   3   5   0   6
    #> 114   2   3   1   0
    #> 
    #> $def
    #>     222 223 224
    #> 222   0   4   2
    #> 223   2   0   1
    #> 224   1   1   0
    

    理论上,如果您的数据是 data.frames 而不是矩阵,这也应该有效

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 2016-12-03
      • 2022-07-01
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多