【问题标题】:Convert dataframe to unnamed list [duplicate]将数据框转换为未命名列表[重复]
【发布时间】:2016-06-14 16:27:50
【问题描述】:

我有一个数据框 df 看起来像这样

    A     B     C     D
1   78    12    43    12
2   23    12    42    13
3   14    42    11    99
4   49    94    27    72

我需要将前两列转换成一个看起来完全一样的列表:

[[1]]
[1] 78 12

[[2]]
[1] 23 12

[[3]]
[1] 14 42

[[4]]
[1] 49 94

基本上是什么

list(c(78, 12), c(23, 12), c(14, 42), c(49, 94)

会的。我试过这个

lapply(as.list(1:dim(df)[1]), function(x) df[x[1],])

还有

lapply(as.list(1:nrow(df)), function(x) df)

但这略有不同。 有什么建议吗?

【问题讨论】:

  • 对于结果列表中没有名字的问题,你会有多迂腐?例如split(df[,1:2],seq_len(nrow(df)))
  • @joran 非常。我完全需要它,就像我描述的那样。list() 会对各种向量做什么...
  • 可能有更简洁的方法:out <- lapply(split(df[,1:2], seq(nrow(df))), function(x) as.numeric(x)); names(out) <- NULL
  • 我收回来,如果你实在找不到名字,你可以mapply(c,df$A,df$B,SIMPLIFY = FALSE)
  • @Stophface 嗯?双打有什么关系?

标签: r list dataframe


【解决方案1】:

你可以试试Map:

Map(c, df$A, df$B)
[[1]]
[1] 78 12

[[2]]
[1] 23 12

[[3]]
[1] 14 42

[[4]]
[1] 49 94

【讨论】:

    【解决方案2】:

    如果对此感兴趣,可以使用foreach 包来完成此操作:

    library(foreach)
    foreach(i=seq.int(nrow(df))) %do% (c(df[[i]][1], df[[i]][2]))
    

    foreach 默认返回一个列表。代码沿行向下运行并从第一列和第二列中提取元素。

    更清晰的阅读版本:

    foreach(i=seq.int(nrow(df))) %do% (df[[i]][1:2])
    

    【讨论】:

      【解决方案3】:

      另一个选项是lapply

      lapply(seq_len(nrow(df1)), function(i) unlist(df1[i, 1:2], use.names=FALSE))
      #[[1]]
      #[1] 78 12
      
      #[[2]]
      #[1] 23 12
      
      #[[3]]
      #[1] 14 42
      
      #[[4]]
      #[1] 49 94
      

      【讨论】:

        猜你喜欢
        • 2021-02-22
        • 1970-01-01
        • 2021-10-07
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        • 2020-05-31
        • 2017-04-19
        相关资源
        最近更新 更多