【问题标题】:How to use data from every row to create a matrix by loop如何使用每一行的数据循环创建矩阵
【发布时间】:2016-07-17 08:44:36
【问题描述】:

我有一个类似的数据框

df<-data.frame(a=c(1,2,3),b=c(4,5,6),c=c(7,8,9),d=c(10,11,12))
  a b c  d
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12

我想使用每一行来创建 3 (nrow(df)) 2*2 矩阵。第一次使用 1,4,7,10,第二次使用 2,5,8,11,第三次使用 3,6,9,12。这样我就可以获得3个矩阵。谢谢。

【问题讨论】:

    标签: r for-loop matrix


    【解决方案1】:

    我们可以使用split将数据集拆分为list并使用matrix

    lapply(split.default(as.matrix(df), row(df)), matrix, 2)
    

    如果我们需要矩阵列是 1、7 后跟 4、10,请使用 byrow=TRUE

    lapply(split.default(as.matrix(df), row(df)), matrix, 2, byrow=TRUE)
    

    或者使用applyMARGIN = 1 并用list 包装它以获得list 输出

    do.call("c", apply(df, 1, function(x) list(matrix(x, ncol=2))))
    

    如果我们需要for 循环,请将a 预分配为list,其中length 等于'df' 的行数

    a <- vector("list", nrow(df))
    for(i in 1:nrow(df)){ a[[i]] <- matrix(unlist(df[i,]), ncol=2)}
    a
    

    或者如果可以存储为array

    array(t(df), c(2, 2, 3))
    

    【讨论】:

    • 我尝试了数组 for (i in 1:nrow(df)) { a
    • @AllenYu 您的方法将在每个循环中替换 a。您可能必须将 a 预分配为长度为 3 的 list 并使用 a[[i]] &lt;-
    【解决方案2】:

    或者使用map:

    m <- matrix(c(t(df)), ncol = 2, byrow = T)
    p <- 2 # number of rows
    Map(function(i,j) m[i:j,], seq(1,nrow(m),p), seq(p,nrow(m),p))
    
    # [[1]]
         # [,1] [,2]
    # [1,]    1    4
    # [2,]    7   10
    
    # [[2]]
         # [,1] [,2]
    # [1,]    2    5
    # [2,]    8   11
    
    # [[3]]
         # [,1] [,2]
    # [1,]    3    6
    # [2,]    9   12
    

    【讨论】:

    • 使用mapply,也可以使用do.call(Map, c(function(...) matrix(c(...), 2, 2), df))。 (或等效的.mapply(function(...) matrix(c(...), 2, 2), df, NULL)
    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多