10

だから私はdata.frameを持っています

dat = data.frame(x = c('Sir Lancelot the Brave', 'King Arthur',  
                       'The Black Knight', 'The Rabbit'), stringsAsFactors=F)

> dat
                       x
1 Sir Lancelot the Brave
2            King Arthur
3       The Black Knight
4             The Rabbit

そしてそれをデータフレームに変換したい

> dat2
                       x    1            2       3      4
1 Sir Lancelot the Brave    Sir   Lancelot     the  Brave
2            King Arthur    King    Arthur
3       The Black Knight    The      Black  Knight 
4             The Rabbit    The     Rabbit

strsplitはデータをリストとして返します

sbt <- strsplit(dat$x, " ")
> sbt
[[1]]
[1] "Sir"      "Lancelot" "the"      "Brave"   

[[2]]
[1] "King"   "Arthur"

[[3]]
[1] "The"    "Black"  "Knight"

[[4]]
[1] "The"    "Rabbit"

また、as.data.tableは必要な場所にNULL値を作成しませんが、値を繰り返します

> t(as.data.table(sbt))
   [,1]   [,2]       [,3]     [,4]    
V1 "Sir"  "Lancelot" "the"    "Brave" 
V2 "King" "Arthur"   "King"   "Arthur"
V3 "The"  "Black"    "Knight" "The"   
V4 "The"  "Rabbit"   "The"    "Rabbit"

as.data.table(x、repeat = FALSE)の引数が本当に必要だと思います。それ以外の場合、このジョブを実行するにはどうすればよいですか?

4

5 に答える 5

11

これは古い質問ですが、私は2つの追加オプションを共有すると思いました。

オプション1

concat.split私の「splitstackshape」パッケージは、まさにこのタイプのもののために設計されました。

library(splitstackshape)
concat.split(dat, "x", " ")
#                        x  x_1      x_2    x_3   x_4
# 1 Sir Lancelot the Brave  Sir Lancelot    the Brave
# 2            King Arthur King   Arthur             
# 3       The Black Knight  The    Black Knight      
# 4             The Rabbit  The   Rabbit        

オプション2

data.table最近(バージョン1.8.11の時点で、私は信じています)、特にこの場合、その兵器庫にいくつかの追加がありましたdcast.data.table。これを使用するにはunlist、データを分割し(@mnelの回答で行われたように)、.N(行ごとの新しい値の数)を使用して「時間」変数を作成し、を使用dcast.data.tableしてデータを目的の形式に変換します。

library(data.table)
library(reshape2)
packageVersion("data.table")
# [1] ‘1.8.11’

DT <- data.table(dat)
S1 <- DT[, list(X = unlist(strsplit(x, " "))), by = seq_len(nrow(DT))]
S1[, Time := sequence(.N), by = seq_len]
dcast.data.table(S1, seq_len ~ Time, value.var="X")
#    seq_len    1        2      3     4
# 1:       1  Sir Lancelot    the Brave
# 2:       2 King   Arthur     NA    NA
# 3:       3  The    Black Knight    NA
# 4:       4  The   Rabbit     NA    NA
于 2013-11-02T10:16:32.157 に答える
10

これが1つのオプションです。単一の複雑さは、data.framesが期待するものであるため、最初に各ベクトルを1行のdata.frameに変換する必要があることrbind.fill()です。

library(plyr)
rbind.fill(lapply(sbt, function(X) data.frame(t(X))))
#     X1       X2     X3    X4
# 1  Sir Lancelot    the Brave
# 2 King   Arthur   <NA>  <NA>
# 3  The    Black Knight  <NA>
# 4  The   Rabbit   <NA>  <NA>

しかし、私自身の傾向は、次のようにベースRを使用することです。

n <- max(sapply(sbt, length))
l <- lapply(sbt, function(X) c(X, rep(NA, n - length(X))))
data.frame(t(do.call(cbind, l)))
#     X1       X2     X3    X4
# 1  Sir Lancelot    the Brave
# 2 King   Arthur   <NA>  <NA>
# 3  The    Black Knight  <NA>
# 4  The   Rabbit   <NA>  <NA>
于 2012-10-18T04:10:48.210 に答える
7
sbt = strsplit(dat$x, " ")
sbt
#[[1]]
#[1] "Sir"      "Lancelot" "the"      "Brave"   
#[[2]]
#[1] "King"   "Arthur"
#[[3]]
#[1] "The"    "Black"  "Knight"
#[[4]]
#[1] "The"    "Rabbit"

ncol = max(sapply(sbt,length))
ncol
# [1] 4

as.data.table(lapply(1:ncol,function(i)sapply(sbt,"[",i)))
#      V1       V2     V3    V4
# 1:  Sir Lancelot    the Brave
# 2: King   Arthur     NA    NA
# 3:  The    Black Knight    NA
# 4:  The   Rabbit     NA    NA
于 2012-10-18T09:48:32.740 に答える
2

表示どおりに使用data.tableすると、使用しようとしています。

library(data.table)
DT <- data.table(dat)
DTB <- DT[, list(y = unlist(strsplit(x, ' '))), by = x]

new <- rep(NA_character_,  DTB[,.N,by =x][which.max(N), N])
names(new) <- paste0('V', seq_along(new))
DTB[,{.new <- new 
      .new[seq_len(.N)] <- y 
       as.list(.new)} ,by= x]

またはreshape2 dcast形を変えるために使用する

library(reshape2)

dcast(DTB[,list(id = seq_len(.N),y),by= x ], x ~id, value.var = 'y')
于 2012-10-18T04:21:39.370 に答える
0

これは、を使用した素晴らしくシンプルなアプローチtidyrです。

library(tidyr)

ncol <- max(sapply(dat, length))

dat %>%
  separate(x, paste0("V", seq(1,ncol)))

注:警告が表示されますが、基本的にseparateは、データにNA'sが埋め込まれていることを示しています。したがって、警告は無視してかまいません。

于 2016-06-06T21:21:53.630 に答える