阻止列表编号出现在 `do.call(“cbind.data.frame”, my_list)` 后的列名中。

huangapple go评论101阅读模式
英文:

Prevent the list number to appear in column names after do.call("cbind.data.frame", my_list)

问题

我经常在使用lapply()后使用do.call("cbind.data.frame", my_list),通常情况下没有问题。但出现以下列表时,绑定后的列名会不同,列表编号会出现在名称之前。

我的列表类似于这样:

  1. dput(my_list)
  2. list(`1` = structure(list(`Pulmonary_embolism~f.20002.0` = NA,
  3. `Pulmonary_embolism~f.20002.1` = NA, `Pulmonary_embolism~f.20002.2` = NA,
  4. `Pulmonary_embolism~f.20002.3` = NA, `Pulmonary_embolism~f.20002.all` = NA), row.names = "1", class = "data.frame"),
  5. `2` = structure(list(`Pulmonary_embolism~f.6152.0` = NA,
  6. `Pulmonary_embolism~f.6152.1` = NA, `Pulmonary_embolism~f.6152.2` = NA,
  7. `Pulmonary_embolism~f.6152.3` = NA, `Pulmonary_embolism~f.6152.all` = NA), row.names = "1", class = "data.frame"))

但在执行do.call("cbind.data.frame", my_list)之后,变量发生了变化:

  1. names(do.call("cbind.data.frame", my_list))
  2. [1] "1.Pulmonary_embolism~f.20002.0" "1.Pulmonary_embolism~f.20002.1" "1.Pulmonary_embolism~f.20002.2" "1.Pulmonary_embolism~f.20002.3" "1.Pulmonary_embolism~f.20002.all"
  3. [6] "2.Pulmonary_embolism~f.6152.0" "2.Pulmonary_embolism~f.6152.1" "2.Pulmonary_embolism~f.6152.2" "2.Pulmonary_embolism~f.6152.3" "2.Pulmonary_embolism~f.6152.all"

如何防止列表编号成为列名的一部分?

英文:

I often use do.call("cbind.data.frame", my_list) after a lapply() call and usually I face no problems. For some reason in the following list the column names are different after binding them; the list number preceeds the names.

My list is something like this:

  1. dput(my_list)
  2. list(`1` = structure(list(`Pulmonary_embolism~f.20002.0` = NA,
  3. `Pulmonary_embolism~f.20002.1` = NA, `Pulmonary_embolism~f.20002.2` = NA,
  4. `Pulmonary_embolism~f.20002.3` = NA, `Pulmonary_embolism~f.20002.all` = NA), row.names = "1", class = "data.frame"),
  5. `2` = structure(list(`Pulmonary_embolism~f.6152.0` = NA,
  6. `Pulmonary_embolism~f.6152.1` = NA, `Pulmonary_embolism~f.6152.2` = NA,
  7. `Pulmonary_embolism~f.6152.3` = NA, `Pulmonary_embolism~f.6152.all` = NA), row.names = "1", class = "data.frame"))

But after do.call("cbind.data.frame", my_list) the variables change:

  1. names(do.call("cbind.data.frame", my_list))
  2. [1] "1.Pulmonary_embolism~f.20002.0" "1.Pulmonary_embolism~f.20002.1" "1.Pulmonary_embolism~f.20002.2" "1.Pulmonary_embolism~f.20002.3" "1.Pulmonary_embolism~f.20002.all"
  3. [6] "2.Pulmonary_embolism~f.6152.0" "2.Pulmonary_embolism~f.6152.1" "2.Pulmonary_embolism~f.6152.2" "2.Pulmonary_embolism~f.6152.3" "2.Pulmonary_embolism~f.6152.all"

How to prevent the list number beeing part of the column name?

答案1

得分: 1

首先,您可以使用 lapplyunlist 提取列名,确保使用 use.names=FALSE 选项来移除列名中的数据框名称。之后,您可以将这些列名应用到 do.call 的输出中,如下所示:

  1. your_names = unlist(lapply(my_list, function(x) colnames(x)), use.names = FALSE)
  2. df = do.call("cbind.data.frame", my_list)
  3. names(df) = your_names
  4. df
  5. #> Pulmonary_embolism~f.20002.0 Pulmonary_embolism~f.20002.1
  6. #> 1 NA NA
  7. #> Pulmonary_embolism~f.20002.2 Pulmonary_embolism~f.20002.3
  8. #> 1 NA NA
  9. #> Pulmonary_embolism~f.20002.all Pulmonary_embolism~f.6152.0
  10. #> 1 NA NA
  11. #> Pulmonary_embolism~f.6152.1 Pulmonary_embolism~f.6152.2
  12. #> 1 NA NA
  13. #> Pulmonary_embolism~f.6152.3 Pulmonary_embolism~f.6152.all
  14. #> 1 NA NA

另一种选择是使用 dplyr 中的 bind_cols 函数,以避免列名中包含数字,如下所示:

  1. library(dplyr)
  2. bind_cols(my_list)
  3. #> Pulmonary_embolism~f.20002.0 Pulmonary_embolism~f.20002.1
  4. #> 1 NA NA
  5. #> Pulmonary_embolism~f.20002.2 Pulmonary_embolism~f.20002.3
  6. #> 1 NA NA
  7. #> Pulmonary_embolism~f.20002.all Pulmonary_embolism~f.6152.0
  8. #> 1 NA NA
  9. #> Pulmonary_embolism~f.6152.1 Pulmonary_embolism~f.6152.2
  10. #> 1 NA NA
  11. #> Pulmonary_embolism~f.6152.3 Pulmonary_embolism~f.6152.all
  12. #> 1 NA NA

创建于 2023-06-29,使用 reprex v2.0.2

英文:

First you could extract the column names using lapply with unlist and make sure you use use.names=FALSE to remove the names of the dataframes in the names of the column. After that you can use these names to your do.call output like this:

  1. your_names = unlist(lapply(my_list, \(x) colnames(x)), use.names = FALSE)
  2. df = do.call("cbind.data.frame", my_list)
  3. names(df) = your_names
  4. df
  5. #> Pulmonary_embolism~f.20002.0 Pulmonary_embolism~f.20002.1
  6. #> 1 NA NA
  7. #> Pulmonary_embolism~f.20002.2 Pulmonary_embolism~f.20002.3
  8. #> 1 NA NA
  9. #> Pulmonary_embolism~f.20002.all Pulmonary_embolism~f.6152.0
  10. #> 1 NA NA
  11. #> Pulmonary_embolism~f.6152.1 Pulmonary_embolism~f.6152.2
  12. #> 1 NA NA
  13. #> Pulmonary_embolism~f.6152.3 Pulmonary_embolism~f.6152.all
  14. #> 1 NA NA

Another option could be using bind_cols from dplyr to not have the numbers in the names like this:

  1. library(dplyr)
  2. bind_cols(my_list)
  3. #> Pulmonary_embolism~f.20002.0 Pulmonary_embolism~f.20002.1
  4. #> 1 NA NA
  5. #> Pulmonary_embolism~f.20002.2 Pulmonary_embolism~f.20002.3
  6. #> 1 NA NA
  7. #> Pulmonary_embolism~f.20002.all Pulmonary_embolism~f.6152.0
  8. #> 1 NA NA
  9. #> Pulmonary_embolism~f.6152.1 Pulmonary_embolism~f.6152.2
  10. #> 1 NA NA
  11. #> Pulmonary_embolism~f.6152.3 Pulmonary_embolism~f.6152.all
  12. #> 1 NA NA

<sup>Created on 2023-06-29 with reprex v2.0.2</sup>

huangapple
  • 本文由 发表于 2023年6月29日 17:23:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/76579763.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定