如何在数据帧中放置具有间隔值的数组?

时间:2016-08-20 09:50:59

标签: r dataframe

我试图将一系列数字拆分成数字。我使用strsplit分割了数字。分割后我拥有的数据集就像 -

strings <- c("001", "002", "003", "004")
dataset <- strsplit(strings, split="")
dataset

[[1]]
[1] "0" "0" "1"

[[2]]
[1] "0" "0" "2"

[[3]]
[1] "0" "0" "3"

[[4]]
[1] "0" "0" "4"

现在,我想将它放入一个数据框中,以便每个数字都在一个单独的列中,用于数组中的所有值。 像这样 -

## V1 V2 V3
##  0  0  1
##  0  0  2
##  .
##  .

有任何建议怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用ldply

中的plyr
library(plyr)

ldply(strsplit(as.character(dataset),split=""))

##    V1 V2 V3
## 1   0  0  1
## 2   0  0  2
## 3   0  0  3
## 4   0  0  4
## 5   0  0  5
## 6   0  0  6
## 7   0  0  7
## 8   0  0  8
## 9   0  0  9
## 10  0  1  0
## 11  0  1  1
## 12  0  1  2
## 13  0  1  3

答案 1 :(得分:1)

应该这样做......

as.data.frame(do.call(rbind, dataset))

...如果所有字符串长度相同。

如果没有,事情变得有点棘手,但这应该做到:

do.call(
  plyr::rbind.fill, 
  lapply(
    dataset, 
    function(x){as.data.frame(t(cbind(x)))}
  )
)

library(plyr
do.call(
  rbind.fill, 
  lapply(
    dataset, 
    function(x){as.data.frame(t(cbind(x)))}
  )
)

如果plyr不是一个选项,可以制作自己的rbind-fill版本......

#' function for binding data.frames even if names do not match
#' @param df1 first data.frame to rbind
#' @param df2 second data.frame to rbind
#' @keywords internal

rbind_fill <- function(df1=data.frame(), df2=data.frame()){
    names_df <- c(names(df1), names(df2))
    if( dim(df1)[1] > 0 ){
        df1[, names_df[!(names_df %in% names(df1))]] <- rep(NA, dim(df1)[1])
    }else{
        df1 <- data.frame()
    }
    if( dim(df2)[1] > 0 ){
        df2[, names_df[!(names_df %in% names(df2))]] <- rep(NA, dim(df2)[1])
    }else{
        df2 <- data.frame()
    }
    rbind(df1, df2)
}

do.call(
  rbind_fill, 
  lapply(
    dataset, 
    function(x){as.data.frame(t(cbind(x)))}
  )
)