【问题标题】:invalid subscript type 'list'无效的下标类型“列表”
【发布时间】:2021-07-16 16:20:50
【问题描述】:

可重现示例的代码:

lst1 <- c('a', 'b', 'c', 'd', 'e', 'f')
lst2 <- round(runif(6, min = 5, max = 12),4)
lst3 <- round(runif(6, min = 6, max = 30),4)
lst4 <- round(runif(6, min = 7, max = 28),4)
lst5 <- round(runif(6, min = 4, max = 25),4)

df1 <- data.frame('st' = lst1, 'value' = lst2)
df2 <- data.frame('st' = lst1, 'value' = lst3)
df3 <- data.frame('st' = lst1, 'value' = lst4)
df4 <- data.frame('st' = lst1, 'value' = lst5)

dfList <- list(df1, df2, df3, df4)

问题说明:对数据框列表中数据框的特定列进行排序
我正在使用如下 for 循环:

dfRanked <- list()
for (df in dfList){
    dfRanked[[df]] <- df[order(df$value, decreasing = FALSE), ]
}

产生错误:

Error in dfRanked[[df]] <- df[order(df$value, decreasing = FALSE), ] : 
  invalid subscript type 'list'

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    for 循环中的迭代器df 是一个数据框。所以dfRanked[[df]] 没有意义。您要求它根据列表(data.frame)对列表进行子集化。我想你正在寻找这样的东西。

    dfRanked <- dfList
    
    for (i in seq_along(dfRanked)){
      dfRanked[[i]] <- dfRanked[[i]][order(dfRanked[[i]]$value, decreasing = FALSE), ]
    }
    

    或者,这应该做同样的事情,但更简洁一些。这将遍历每个元素并每次应用函数。

    lapply(dfList, function(df) df[order(df$value, decreasing = FALSE), ])
    

    最后在tidyverse 发言,你可以做这样的事情。

    library(dplyr)
    library(purrr)
    
    map(dfList, arrange, value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2015-11-01
      • 2018-05-22
      • 1970-01-01
      • 2015-03-18
      相关资源
      最近更新 更多