Как поместить массив с разнесенными значениями во фрейм данных?

r dataframe

35 просмотра

2 ответа

Я пытаюсь разбить ряд чисел на цифры. Я разделил цифры с помощью 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
##  .
##  .

Любые предложения, как это сделать?

Автор: harsh Источник Размещён: 08.11.2019 11:08

Ответы (2)


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
Автор: steveb Размещён: 20.08.2016 10:06

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)))}
  )
)
Автор: petermeissner Размещён: 20.08.2016 10:08
Вопросы из категории :
32x32