Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何在数据帧中放置具有间隔值的数组?_R_Dataframe - Fatal编程技术网

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

R 如何在数据帧中放置具有间隔值的数组?,r,dataframe,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" 有什么建议吗?您可以使用plyr软件包中

我正试图把一系列数字分成数字。我用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"

有什么建议吗?

您可以使用
plyr
软件包中的
ldply

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

这应该可以解决问题

as.data.frame(do.call(rbind, dataset))
。。。如果所有字符串的长度相同

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

do.call(
  plyr::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)))}
  )
)
用于绑定data.frames(即使名称不匹配)的函数 #“@param df1第一个data.frame到rbind #“@param df2第二个data.frame到rbind #“@关键字内部
谢谢!将软件包安装到“/home/harsh/R/x86_64-pc-linux-gnu-library/3.0”(由于“lib”未指定)警告消息:软件包“plyr”不可用(对于R版本3.0.2),没有plyr是否可能?上提供了
plyr
软件包。然而,我使用的是R的3.2.3版。是的,你可以做一些类似于@petermissner答案中的事情:
as.data.frame(do.call(rbind,strsplit(as.character(dataset),split=“”))
如果plyr可用,这是更好的解决方案。谢谢!将软件包安装到“/home/harsh/R/x86_64-pc-linux-gnu-library/3.0”(由于“lib”未指定)警告消息:软件包“plyr”不可用(适用于R版本3.0.2)是否可以不使用plyr?
do.call(rbind,dataset)
开箱即用;尝试更新您的R并再次尝试安装plyr;我认为data.table包有一个rbind fill函数well@petermeissner我相信您的第一个
do.call
命令输出的是一个矩阵,而不是一个数据帧(对我来说就是这样)。您必须将矩阵转换为数据帧。
library(plyr
do.call(
  rbind.fill, 
  lapply(
    dataset, 
    function(x){as.data.frame(t(cbind(x)))}
  )
)
#' 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)))}
  )
)