【问题标题】:R Include lists of Strings in DataframeR在Dataframe中包含字符串列表
【发布时间】:2017-05-11 15:04:16
【问题描述】:

我正在尝试创建一个人工数据框,其中包含维基百科用户为他们所做的每次编辑贡献和删除的单词,最终结果应如下所示:

我创建了一些人工数据来构建这样一个框架,但我遇到了变量“添加令牌”和“删除令牌”的问题。

我认为将它们创建为列表列表可以让我将它们包含在数据框中,即使元素并不总是具有相同的长度。但显然情况并非如此。相反,R 为每个单独的标记创建一个变量。那是不可行的,因为它会产生数百万个变量。下面是一些示例代码:

a <- c(1,2,3)
e <- list(b = as.list(c("a","b")),c = as.list(c(1L,3L,5L,4L)),d = as.list(c(TRUE,FALSE,TRUE)))

DF <- cbind(a,e)
U <- data.frame(a,e)

我想要这样:

在带有数据框的 R 中这是否可能(我已经尝试过寻找答案,但它们要么是针对不同的问题,要么对我来说太技术性了)?非常感谢任何帮助!

【问题讨论】:

  • 我认为这在您想要的意义上是不可能的。 Data.frames 是等长向量的列表。你需要做/想做的是创建一个列表向量。据我所知这是不可能的(见stackoverflow.com/questions/2624791/…
  • 另一种选择是让每个元素都是一个字符,但只是列表内容的粘贴版本

标签: r list dataframe


【解决方案1】:

我认为使用列表向量不可能实现您想要的(正如您在问题中所建议的那样)。这主要是因为您无法在 R 中创建列表向量(请参阅:How to create a vector of lists in R?

但是,一种选择(如果您真的想要data.frame)是将所有内容强制转换为字符(R 中最灵活的类型)。像这样的东西可能对你有用:

e <- c(paste0(c("a","b"),collapse=","), paste0(c(1L,3L,5L,4L), collapse = ","), paste0(c(TRUE,FALSE,TRUE), collapse = ","))
U <- data.frame(a,e, stringAsFactors = F)

U
#  a               e
#1 1             a,b
#2 2         1,3,5,4
#3 3 TRUE,FALSE,TRUE

然后您可以通过拆分来回退每个单元格的值。比如:

strsplit(U$e, ",")

【讨论】:

    【解决方案2】:

    如果你愿意使用library(tibble),你可以做你想做的事:

    library(tibble)
    
    a <- c(1,2,3)
    e <- list(b = as.list(c("a","b")),c = as.list(c(1L,3L,5L,4L)),d = as.list(c(TRUE,FALSE,TRUE)))
    
    tibble(a,e)
    # A tibble: 3 × 2
          a          e
      <dbl>     <list>
    1     1 <list [2]>
    2     2 <list [4]>
    3     3 <list [3]>
    

    tibbletbl_df 的行为与您习惯的传统data.frame 一样,但允许您提供一些不错的额外功能,例如在列中存储各种长度的列表。

    【讨论】:

    • 感谢您的建议!如果我在我的示例中尝试它,它只会产生这个错误:Error: Variables must be length 1 or 9. Problem variables: 'a'
    【解决方案3】:

    试试这个:

    cbind(a,lapply(e,function(x) paste(unlist(x),collapse=",")))
    

    【讨论】:

      【解决方案4】:

      感谢大家的所有建议!我想我找到了一个更简单的解决方案。以防万一其他人将来遇到类似问题,这就是我所做的:

      a <- c(1,2,3)
      b <- c("a","b")
      c <- c(1L,3L,5L,4L)
      d <- c(TRUE,FALSE,TRUE)
      e <- list(b,c,d);e
      
      DF <- data.frame(a,I(e));DF
      

      I() inhibit function 显然阻止了列表的转换,并且据我所知,该列的行为就像列表列表一样。然而,e 列的类不是“列表”而是“AsIs”。我不知道这是否会导致进一步的问题,如果是,我会更新这个答案!

      编辑

      所以事实证明,有些函数不将 AsIs 类作为输入。要将其转换回有用的字符串,您只需在每一行上使用 unlist() 即可。

      【讨论】:

        猜你喜欢
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-13
        • 2016-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多