【问题标题】:Modify dataframes in list with R用 R 修改列表中的数据框
【发布时间】:2018-11-14 21:53:37
【问题描述】:

我想处理一堆数据帧的列和行名,比如 W1W2W3,它们的名字列在先前构建的列表中,例如 W。我见过很多类似的问题,但似乎没有一个能解决我的困难:

>  W <- list(W1, W2, W3)
>  lapply(W, is.data.frame)
$W1
[1] TRUE
$W2
[1] TRUE
$W3
[1] TRUE

最终我想做的是:

>  lapply(W, function(x) rowname(x) = x[,1])
>  lapply(W, function(x) x = x[,-1])
  • 使用每个数据框的第一列值定义行名称。
  • 在那之后抑制第一列,

但在这两种情况下,我都会获得每个数据框第一列的内容。我错过了一些基本的东西......

【问题讨论】:

    标签: r list dataframe lapply


    【解决方案1】:

    只需将这两个步骤合二为一lapply。请记住,在 R 中,函数将返回它评估的最后一件事,因此在您的第一个 lapply 中,它只会返回每个 data.frame 的 rownames,因为这是该函数所做的最后一件事。之后添加x[,-1] 使其返回修改后的data.frame,减去第一列。

    W1 <- data.frame(a=letters[1:3], b=1:3, c=4:6)
    W2 <- data.frame(a=letters[4:5], b=4:5, c=5:6)
    W3 <- data.frame(a=LETTERS[1:5], b=1:5, c=11:15)
    W <- list(W1, W2, W3)
    
    W <- lapply(W, function(x) {
        row.names(x) <- x[,1]
        x[,-1]
    })
    

    【讨论】:

    • 德克萨斯州。我冒昧地编辑了您的答案,以使其成为可行的解决方案。 1/ x[,-1] 中的拼写错误,您写为 [x,-1] 并且 2/ 添加了对 W 的赋值为 W
    【解决方案2】:

    tidyverse 使用@Taiki-Sakai 的数据:

    library(tidyverse)
    map(W, column_to_rownames, "a") # use remove_rownames(W) if relevant
    # [[1]]
    #   b c
    # a 1 4
    # b 2 5
    # c 3 6
    # 
    # [[2]]
    #   b c
    # d 4 5
    # e 5 6
    # 
    # [[3]]
    #   b  c
    # A 1 11
    # B 2 12
    # C 3 13
    # D 4 14
    # E 5 15
    # 
    

    【讨论】:

    • 嗨安托万和 tx。 Yr 提出的解决方案可行,但是当您可以使用基本包工具以稍高的打字成本做到这一点时,为什么还要引入另一个包......节俭规则。
    • 您绝对正确,您不应该为可以在基础 R 中完成的快速任务附加新包。但是,这些小任务通常是更大项目的一部分。如果总体而言,您在 purrr 中看到了价值并将其附加到给定项目中,则此解决方案是一种紧凑且可读的替代方案,因此我相信有些人可能会从中找到价值。
    猜你喜欢
    • 1970-01-01
    • 2020-10-27
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多