【问题标题】:How to change names of columns in data frames which are in list, by data frame name?如何通过数据框名称更改列表中数据框中列的名称?
【发布时间】:2018-01-18 07:56:53
【问题描述】:

我在更改列表中数据框列的名称时遇到问题 - 我有 不同行数 的 df 列表,但我认为这对我想做的事情并不重要.我想通过向它们添加数据框的名称来更改指定列的名称,好吧,这就是我想要获得的:

1.让我们创建一些假数据:

    a <- c(1,2,3,4)
    b <- runif(4)
    c <- runif(4)
    d <- runif(4)
    df1 <- data.frame(a,b,c,d)
    df2 <- data.frame(a,b,c,d)
    df3 <- data.frame(a,b,c,d)
    my_list <- list(df1=df1, df2=df2)

我创建这些向量三次(在创建 df 之前)以获得不同的值,因此我有:

$df1
  a         b          c           d
1 1 0.6351811 0.51084221 0.038293376
2 2 0.9841223 0.15052422 0.877096060
3 3 0.3502053 0.01400321 0.231091711
4 4 0.8116008 0.46730937 0.006989978

$df2
  a          b         c         d
1 1 0.08205446 0.9186334 0.3346115
2 2 0.39882413 0.9171668 0.7663191
3 3 0.93652356 0.5607171 0.5846735
4 4 0.62940152 0.6683307 0.1347783

$df3
  a         b          c         d
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277

现在我想得到什么:

> my_list
$df1
  a     b_df1      c_df1     d_df1
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277

$df2
  a     b_df2      c_df2     d_df2
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277

$df3
  a     b_df3      c_df3     d_df3
1 1 0.6447916 0.83892606 0.4874532
2 2 0.6116721 0.09312807 0.9374633
3 3 0.3386178 0.29927137 0.5407353
4 4 0.5044569 0.81893434 0.8775277

到目前为止我做了什么?

当然我可以这样做:

colnames(my_list[[1]]) <- c('a', paste(colnames(my_list[[1]])[2:4],'_','df1', sep=''))
colnames(my_list[[2]]) <- c('a', paste(colnames(my_list[[2]])[2:4],'_','df2', sep=''))
colnames(my_list[[3]]) <- c('a', paste(colnames(my_list[[3]])[2:4],'_','df3', sep=''))

但我想使用 lapply() 因为我的数据是一个列表,里面有很多数据框,所以我做了类似的东西:

tmp <- names(my_list)
lapply(tmp, function(x) colnames(my_list[[x]]) <- c('GENE_SYMBOL', paste(colnames(my_list[[x]])[2:4],'_',x, sep='')))

不幸的是,结果是:

[[1]]
[1] "GENE_SYMBOL" "b_df1"       "c_df1"       "d_df1"      

[[2]]
[1] "GENE_SYMBOL" "b_df2"       "c_df2"       "d_df2"      

[[3]]
[1] "GENE_SYMBOL" "b_df3"       "c_df3"       "d_df3"

关闭但不正确,不知道为什么:(

我认为这不是 question 的重复,因为这里我的列名是基于数据框的名称...

【问题讨论】:

  • setNames(lapply(tmp, function(x) colnames(my_list[[x]]) &lt;- c('GENE_SYMBOL', paste(colnames(my_list[[x]])[2:4],'_',x, sep=''))), tmp) 怎么样?
  • @Axeman。你是对的。有点不一样。

标签: r list lapply paste


【解决方案1】:

你几乎完成了! 只需以这种方式将您的循环转换为 lapply:

lapply(seq_along(my_list), function(i)
  colnames(my_list[[i]]) <-
    c('GENE_SYMBOL', paste0(colnames(my_list[[i]])[2:4], '_', tmp[i])))

并使用 paste0 因为你不需要分隔符。

【讨论】:

    【解决方案2】:

    我说过我想使用 lapply() 但是...

    tmp <- names(my_list)
    for (i in seq_along(my_list)){
      colnames(my_list[[i]]) <- c('GENE_SYMBOL', paste(colnames(my_list[[i]])[2:4],'_',tmp[i], sep=''))
    }
    my_list
    >my_list
    
    $df1
      GENE_SYMBOL     b_df1      c_df1     d_df1
    1           1 0.6447916 0.83892606 0.4874532
    2           2 0.6116721 0.09312807 0.9374633
    3           3 0.3386178 0.29927137 0.5407353
    4           4 0.5044569 0.81893434 0.8775277
    
    $df2
      GENE_SYMBOL     b_df2      c_df2     d_df2
    1           1 0.6447916 0.83892606 0.4874532
    2           2 0.6116721 0.09312807 0.9374633
    3           3 0.3386178 0.29927137 0.5407353
    4           4 0.5044569 0.81893434 0.8775277
    
    $df3
      GENE_SYMBOL     b_df3      c_df3     d_df3
    1           1 0.6447916 0.83892606 0.4874532
    2           2 0.6116721 0.09312807 0.9374633
    3           3 0.3386178 0.29927137 0.5407353
    4           4 0.5044569 0.81893434 0.8775277
    

    谢谢...

    【讨论】:

      猜你喜欢
      • 2021-02-15
      • 1970-01-01
      • 2019-01-10
      • 2018-01-12
      • 1970-01-01
      • 2021-03-29
      • 2017-12-03
      • 2018-01-04
      • 2016-10-27
      相关资源
      最近更新 更多