R 如何在数据帧中放置具有间隔值的数组?
我正试图把一系列数字分成数字。我用strsplit把数字分开。拆分后的数据集类似于-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软件包中
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)))}
)
)