【问题标题】:Changing the names of a column to the name of a data.frame in a list of data.frames将列的名称更改为 data.frames 列表中的 data.frame 的名称
【发布时间】:2020-07-26 12:19:47
【问题描述】:

我在一个列表中有许多大小相同的矩阵:

我将它们与Reduce and join 合并:

env.all <- Reduce(function(...) left_join(..., by = c('X1', 'X2')), dists.can) 

但由于 data.frames 中所有可连接的列都被称为“值”,所以新的 data.frame 的名称很尴尬:

names(env.all)
[1] "X1"            "X2"            "value.x"       "value.y"       "value.x.x"     "value.y.y"     "value.x.x.x"   "value.y.y.y"  
 [9] "value.x.x.x.x" "value.y.y.y.y" "value" 

为了防止这种情况,我想用父母 data.frame 的名称重命名 dist.can 中的每一列 $value,例如。 dist.can$aridity$value 变为例如“dist.can$aridity$aridity”。

dists.can <- lapply(dists.can, function(x) {names(x$value) <- names(x);x})

但这失败了。它什么也不做。我怎样才能做到这一点?

玩具数据:

dist.can <- list(Name1=data.frame(X1=LETTERS[1:10], X2=letters[1:10], value=runif(10)),
     Name2=data.frame(X1=LETTERS[1:10], X2=letters[1:10], value=runif(10)),
     Name3=data.frame(X1=LETTERS[1:10], X2=letters[1:10], value=runif(10)))

【问题讨论】:

    标签: r


    【解决方案1】:

    您没有共享要替换 value 列的内容。我们可以添加列表名称作为前缀。另外names(x$value) 是在命名value 中的值,而不是列名。

    Map(function(x, y) {names(x)[names(x) == 'value'] <- paste0('value_', y);x},
                        dist.can, names(dist.can))
    

    也许,tidyverse 更简单:

    library(dplyr)
    library(purrr)
    
    imap(dist.can, ~.x %>% rename_with(function(x) paste0('value_', .y),value))
    

    【讨论】:

    • 谢谢。我的问题确实不清楚,所以我对其进行了编辑。但是,无论如何,您设法掌握了它,并且您的解决方案效果很好。
    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2021-02-15
    • 2019-04-28
    • 1970-01-01
    • 2019-12-25
    相关资源
    最近更新 更多