【问题标题】:vector to dataframe in r given length of vector给定向量长度的r中的向量到数据帧
【发布时间】:2023-10-29 19:29:02
【问题描述】:

我有不同长度的向量。例如:

df1
[1]   1  95   5   2 135   4   3 135   4   4 135   4   5 135   4   6 135   4

df2
[1]   1  70   3   2 110   4   3 112   4

我正在尝试在 R 中编写一个脚本,以便让任何向量进入函数或 for 循环,它会返回一个三列的数据框。因此,每个输入向量都有一个单独的数据框。每个向量都是三的倍数(因此是三列)。在编写函数方面,我对 R 相当陌生,似乎无法弄清楚这一点。这是我的尝试:

newdf = c()
ld <- length(df1)
ld_mult <- length(df1)/3
ld_seq <- seq(from=1,to=ld,by=3)
ld_seq2 < ld_seq +2
for (i in 1:ld_mult) {
  newdf[i,] <- df1[ld_seq[i]:ld_seq2[i]]
}

我想要 df1 的输出是:

1 95    5
2 135   4
3 135   4
4 135   4
5 135   4
6 135   4

【问题讨论】:

    标签: r vector dataframe


    【解决方案1】:

    这是一个示例,说明如何为此目的使用 matrix

    x <- c(1, 95, 5,2, 135, 4, 3, 135, 4)
    
    as.data.frame(matrix(x, ncol = 3, byrow = TRUE))
    #  V1  V2 V3
    #1  1  95  5
    #2  2 135  4
    #3  3 135  4
    

    还有

    y <- c(1, 70, 3, 2, 110, 4, 3, 112, 4)
    as.data.frame(matrix(y, ncol = 3, byrow = TRUE))
    #  V1  V2 V3
    #1  1  70  3
    #2  2 110  4
    #3  3 112  4
    

    或者如果你想把它变成一个自定义函数:

    newdf <- function(vec) {
      as.data.frame(matrix(vec, ncol = 3, byrow = TRUE))
    }
    
    newdf(y)
    #V1  V2 V3
    #1  1  70  3
    #2  2 110  4
    #3  3 112  4
    

    如果您向 newdf 添加另一个参数,您还可以让用户指定他想要使用该函数创建的列数:

    newdf <- function(vec, cols = 3) {
      as.data.frame(matrix(vec, ncol = cols, byrow = T))
    }
    

    现在,如果用户没有指定数字,默认列数是 3。如果他愿意,他可以这样使用它:

    newdf(z, 5) # to create 5 columns
    

    该函数的另一个不错的小插件是检查输入向量长度是否是函数调用中指定的列数的倍数:

    newdf <- function(vec, cols = 3) {
      if(length(vec) %% cols != 0) {
        stop("Number of columns is not a multiple of input vector length. Please double check.")
      }
      as.data.frame(matrix(vec, ncol = cols, byrow = T))
    }
    
    newdf(x, 4)
    #Error in newdf(x, 4) : 
    #  Number of columns is not a multiple of input vector length. Please double check.
    

    如果您有多个向量位于 list 中,那么您可以将它们中的每一个转换为 data.frame

    > l <- list(x,y)
    > l
    #[[1]]
    #[1]   1  95   5   2 135   4   3 135   4
    #
    #[[2]]
    #[1]   1  70   3   2 110   4   3 112   4
    
    > lapply(l, newdf)
    #[[1]]
    #  V1  V2 V3
    #1  1  70  3
    #2  2 110  4
    #3  3 112  4
    #
    #[[2]]
    #  V1  V2 V3
    #1  1  70  3
    #2  2 110  4
    #3  3 112  4
    

    【讨论】: