【问题标题】:R: How to fill one column matrices of different dimensions in a LOOP?R:如何在一个循环中填充一列不同维度的矩阵?
【发布时间】:2015-10-28 11:44:46
【问题描述】:

我已经问过类似的question,但是输入数据的维度不同,我没有得到较大的数组填充较小的矩阵或数组。这里有一些显示我的结构的基本示例数据:

dfList <- list(data.frame(CNTRY = c("B", "C", "D"), Value=c(3,1,4)),
               data.frame(CNTRY = c("A", "B", "E"),Value=c(3,5,15)))
names(dfList) <- c("111.2000", "112.2000")

输入数据是一个 >1000 dfs 的列表。我把它变成了一个矩阵列表,第一列作为行名。这里:

dfMATRIX <- lapply(dfList, function(x) {
  m <- as.matrix(x[,-1])
  rownames(m) <- x[,1]
  colnames(m) <- "Value"
  m
})

我尝试将这个矩阵列表填充到一个数组中,如我以前的问题中所示。这里:

loadandinstall("abind")
CNTRY <- c("A", "B", "C", "D", "E")
full_dflist <- array(dim=c(length(CNTRY),1,length(dfMATRIX)))
dimnames(full_dflist) <- list(CNTRY, "Value", names(dfMATRIX))

for(i in seq_along(dfMATRIX)){
  afill(full_dflist[, , i], local= TRUE ) <- dfMATRIX[[i]]   
}

给出错误信息:

Error in `afill<-.default`(`*tmp*`, local = TRUE, value = c(3, 1, 4)) : 
  does not make sense to have more dims in value than x

有什么想法吗? 我还尝试在我之前的问题中使用acastarray() 而不是dfMATRIX &lt;- lapply... 命令。我会假设我的full_dflist-array 的第二维(对不起命名:))是错误的,但我不知道如何编写输入。非常感谢您的想法。

Edit2:对不起,我放错了输出:)这是我的新预期输出:

$`111.2000`
  Value
A    NA
B     3
C     1
D     4
E    NA

$`112.2000`
  Value
A     3
B     5
C    NA
D    NA
E    15

【问题讨论】:

    标签: arrays r list matrix fill


    【解决方案1】:

    这可能是使用data.table 的一种解决方案:

    library(data.table)
    #create a big data.table with all the elements
    biglist <- rbindlist(dfList)
    #use lapply to operate on individual dfs
    lapply(dfList, function(x) {
      #use the big data table to merge to each one of the element dfs
      temp <- merge(biglist[, list(CNTRY)], x, by='CNTRY', all.x=TRUE)
      #remove the duplicate values
      temp <- temp[!duplicated(temp), ] 
      #convert CNTRY to character and set the order on it
      temp[, CNTRY := as.character(CNTRY)]
      setorder(temp, 'CNTRY')
      temp
      })
    

    输出:

    $`111.2000`
       CNTRY Value
    1:     A    NA
    2:     B     3
    3:     C     1
    4:     D     4
    5:     E    NA
    
    $`112.2000`
       CNTRY Value
    1:     A     3
    2:     B     5
    3:     C    NA
    4:     D    NA
    5:     E    15
    

    编辑

    对于更新后的输出,您可以这样做:

    lapply(dfList, function(x) {
      temp <- merge(biglist[, list(CNTRY)], x, by='CNTRY', all.x=TRUE)
      temp <- temp[!duplicated(temp), ] 
      temp[, CNTRY := as.character(CNTRY)]
      setorder(temp, 'CNTRY')
      data.frame(Value=temp$Value, row.names=temp$CNTRY)
      })
    
    $`111.2000`
      Value
    A    NA
    B     3
    C     1
    D     4
    E    NA
    
    $`112.2000`
      Value
    A     3
    B     5
    C    NA
    D    NA
    E    15
    

    但我真的建议保留带有 data.table 元素的列表,而不是转换为 data.frames,这样您就可以拥有 row.names。

    【讨论】:

    • 也许只是一个小问题,我怎样才能得到一个list of dfs 一个list of vectors (好像行名是在输出中排序的,我真的不需要它们)?非常感谢
    • 您可以将lapply 中的最后一行从data.frame(Value=temp$Value, row.names=temp$CNTRY) 替换为temp[, Value]。而且它只会是一个向量。
    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多