次のデータフレーム列を内容に応じて3列に分割しようとしています。dplyrとmutateをもっとよく学びたかったので使ってみましたが、どんな提案でも大歓迎です。
exampledf<-data.frame(c("Argentina","2005/12","2005/11","Bolivia","2006/12"),stringsAsFactors=F)
mutate(exampledf,month=strsplit(exampledf[,1],"/")[1],month=strsplit(exampledf[,1],"/")[2])
私の目標:
Year Month Country
2005 12 Argentina
2005 11 Argentina
2006 12 Bolivia
これはこのSOの投稿に非常に近いですが、私の繰り返しの国の問題には対処していません。
数値のない行(「i1」)の論理インデックスを作成し、その累積合計、split
そのグループ化インデックスを含むデータセットを取得し、「年」、「月」を(sub
)で抽出し、「国」を次のように抽出します。最初の要素は、作成data.frame
、および内容。rbind
list
i1 <- grepl('^[^0-9]+$', exampledf$Col1)
lst <- lapply(split(exampledf, cumsum(i1)), function(x)
data.frame(year= as.numeric(sub('\\/.*', '', x[-1,1])),
month = as.numeric(sub('.*\\/', '', x[-1,1])),
Country = x[1,1] ) )
res <- do.call(rbind, lst)
row.names(res) <- NULL
res
# year month Country
#1 2005 12 Argentina
#2 2005 11 Argentina
#3 2006 12 Bolivia
またはdata.table
、を使用して、「data.frame」を「data.table」(setDT(exampledf)
)に変換しcumsum
、インデックスの(上から)でグループ化してtstrsplit
、「Col1」(最初の要素を削除)で区切り文字(/
)を使用して()を分割します。その中から2つの列が得られます。次に、最初の要素を連結して3つの列を作成し、列名をsetnames
。で変更します。グループ化変数が必要ない場合は:=
、NULLに()を割り当てることができます。
library(data.table)
res1 <- setDT(exampledf)[, c(tstrsplit(Col1[-1],
'/'),Country = Col1[1L]), .(i2=cumsum(i1))][,i2:= NULL][]
setnames(res1, 1:2, c('year', 'month'))
exampledf<-data.frame(Col1=c("Argentina","2005/12","2005/11",
"Bolivia","2006/12"),stringsAsFactors=FALSE)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加