【问题标题】:Convert a key value data frame to a list将键值数据框转换为列表
【发布时间】:2016-03-08 20:53:34
【问题描述】:

这是我拥有的结构类型。数据框中有几千行,其结构类似于以下内容:

vct_names <- c("apples", "apples", "grapes", "apples", "grapes")
vct_codes <- c(23, 35, 123, 43, 156)
df_values <- data.frame(names = vct_names, codes = vct_codes)

我想将上面的数据框转换成一个命名列表。我想遍历上面数据框的每一行并将这个数据框转换为一个列表。该列表将具有以下结构:

lst_values <- list()
lst_values$apples <- c(23, 35, 43)
lst_values$grapes <- c(123, 156)

关于解决此问题的优雅方法的任何想法。

【问题讨论】:

    标签: r list dataframe lapply


    【解决方案1】:

    split-函数正是为此而设计的。它适用于数据帧和向量作为第一个参数。它通过作为一个泛型函数来完成这种多态行为。

    > methods(split)
    [1] split.data.frame  split.data.table* split.Date        split.default    
    [5] split.IDate*      split.POSIXct     split.zoo*       
    see '?methods' for accessing help and source code
    

    所以这样会更经济:

    > lst_values <- split(vct_codes, vct_names)
    > lst_values
    $apples
    [1] 23 35 43
    
    $grapes
    [1] 123 156
    

    在这种情况下,我们使用split.default。有时将代码打印出来会提供很多信息,但在这种情况下,我们只看到在将数据和参数传递给 .Internal(split(seq_along(x), f)) 之前对边缘情况进行了一些初步操作。

    【讨论】:

      【解决方案2】:
      lapply(split(df_values, df_values$names), function(z) z[,2])
      
      $apples
      [1] 23 35 43
      
      $grapes
      [1] 123 156
      

      【讨论】:

      • 它是一个美女!我们是否需要在 lapply() 中嵌套 split() split(df_values, df_values$names) 似乎工作得很好。
      • split() 将 data.frame 拆分为列表中的许多 data.frame,因此需要遍历每个 data.frame 并仅提取一列值
      • 不需要 lapply。 split 函数将作用于向量并返回一个命名列表。
      • 更不用说 split + lapply = ?by
      猜你喜欢
      • 1970-01-01
      • 2021-08-24
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 2020-04-17
      相关资源
      最近更新 更多