【问题标题】:Structuring data frames to list R构建数据框以列出 R
【发布时间】:2017-02-01 16:26:47
【问题描述】:

这是我希望的一些数据和最终结果。我有许多 dfs(例如 2 个),我想将它们构建为列表。示例更好地解释它:

names <- as.yearmon(seq(as.Date("2010-01-01"), to=as.Date("2010-05-01"), by="month"))
names

df1 <- data.frame(X1 = c(1,2,3,4,5), X2 = c(1,2,3,4,5), X3 = c(1,2,3,4,5))
rownames(df1) <- names
df2 <- data.frame(Y1 = c(10,20,30,40,50), Y2 = c(10,20,30,40,50), Y3 = c(10,20,30,40,50))
rownames(df2) <- names

FullList <- list()
length(FullList) <- 5

names(FullList) <- names

FullList[[1]][[1]] <- df1[match(names(FullList)[1], rownames(df1)), ]
FullList[[1]][[2]] <- df2[match(names(FullList)[1], rownames(df2)), ]

FullList[[2]][[1]] <- df1[match(names(FullList)[2], rownames(df1)), ]
FullList[[2]][[2]] <- df2[match(names(FullList)[2], rownames(df2)), ]

FullList[[3]][[1]] <- df1[match(names(FullList)[3], rownames(df1)), ]
FullList[[3]][[2]] <- df2[match(names(FullList)[3], rownames(df2)), ]

FullList[[4]][[1]] <- df1[match(names(FullList)[4], rownames(df1)), ]
FullList[[4]][[2]] <- df2[match(names(FullList)[4], rownames(df2)), ]

FullList[[5]][[1]] <- df1[match(names(FullList)[5], rownames(df1)), ]
FullList[[5]][[2]] <- df2[match(names(FullList)[5], rownames(df2)), ]

因此,来自 2 个或更多数据帧的列表最终会得到列表,通用名称作为主列表名称。最终结果应该类似于FullList,实现这一目标的最佳方法是什么?

【问题讨论】:

  • 数据帧列表。也许你只想要unclass?目前,您的列表中的元素仍然是数据框。那是你想要的吗?
  • 忽略你想要的数据结构的可怕性,这是实现该格式的一种简单方法:FullList = mapply(function(x, y) list(x, y), split(df1, rownames(df1)), split(df2, rownames(df2)), SIMPLIFY = F) 这将替换 FullList &lt;- list() 行及其以下的所有代码
  • 感谢 cmets,也许我必须重新考虑我的结构。我有很多不同的东西,它们都是按日期排序的,我认为首先列出一个日期可以让事情井井有条。这些dfs也可以是矩阵或向量或其他东西。

标签: r list dataframe


【解决方案1】:

这应该可以实现请求,但我同意 Vlo 这似乎是一个笨拙的数据结构:

lapply( names, function(nm) {
        list( df1[ nm == rownames(df1), ,drop=FALSE], 
              df2[ nm == rownames(df2), ,drop=FALSE]) ) }

【讨论】:

    【解决方案2】:

    一个简单的循环可以为您工作。

    for (listrow in 1:5) {
      for (dataframe in 1:2) {
    eval(parse(text=paste("FullList[[",listrow,"]][[",dataframe,"]] <- df",dataframe,"[match(names(FullList)[",listrow,"], rownames(df",dataframe,")), ]",sep="")))
    }
    }
    

    这个循环执行以下命令

    for (listrow in 1:5) {
      for (dataframe in 1:2) {
        print(paste("FullList[[",listrow,"]][[",dataframe,"]] <- df",dataframe,"[match(names(FullList)[",listrow,"], rownames(df",dataframe,")), ]",sep=""))
      }
    }
    [1] "FullList[[1]][[1]] <- df1[match(names(FullList)[1], rownames(df1)), ]"
    [1] "FullList[[1]][[2]] <- df2[match(names(FullList)[1], rownames(df2)), ]"
    [1] "FullList[[2]][[1]] <- df1[match(names(FullList)[2], rownames(df1)), ]"
    [1] "FullList[[2]][[2]] <- df2[match(names(FullList)[2], rownames(df2)), ]"
    [1] "FullList[[3]][[1]] <- df1[match(names(FullList)[3], rownames(df1)), ]"
    [1] "FullList[[3]][[2]] <- df2[match(names(FullList)[3], rownames(df2)), ]"
    [1] "FullList[[4]][[1]] <- df1[match(names(FullList)[4], rownames(df1)), ]"
    [1] "FullList[[4]][[2]] <- df2[match(names(FullList)[4], rownames(df2)), ]"
    [1] "FullList[[5]][[1]] <- df1[match(names(FullList)[5], rownames(df1)), ]"
    [1] "FullList[[5]][[2]] <- df2[match(names(FullList)[5], rownames(df2)), ]"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 2015-04-21
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 2019-05-20
      相关资源
      最近更新 更多