2017-04-05 9 views
0

リストを「サブセット化」するのが難しいです。例えば、R:リストの機能(選択/サブ設定)

test <- data.frame(x = c("5353-66", "55-110-4000","6524-533", "62410-165", "653-520-2410")) 
test$x <- as.character(test$x) 

strsplit(test$x, "-") 

strsplitは、以下のように私のリストを与える

[[1]] 
[1] "5353" "66" 

[[2]] 
[1] "55" "110" "4000" 

[[3]] 
[1] "6524" "533" 

[[4]] 
[1] "62410" "165" 

[[5]] 
[1] "653" "520" "2410" 

私はlapply(strsplit(test$x, "-"), "[[", 1)を実行すると、それは私に以下のようにリストの各コンポーネントからの最初の文字列を与えます:

[[1]] 
[1] "5353" 

[[2]] 
[1] "55" 

[[3]] 
[1] "6524" 

[[4]] 
[1] "62410" 

[[5]] 
[1] "653" 

次に、[[1]]と[[2]]全体をどのように選択すればよいですか? [[3]] ...別に?

たとえば、test $ y [1]をc( "5353"、 "66")とし、$ y [2]をc( "55"、 "110"、 "4000"等々。

test$y <- lapply(strsplit(test$x, "-"), "[", 1) 

上記の行から同じ結果が得られました。

+0

それは非常に厄介storyingに複数の要素を取得することができますdata.frameのセル。これが本当に必要ですか? 'test $ y <-strsplit(test $ x、" - ")'はリストを割り当てます。 vectorを得るには 'test $ y [[1]]'、 'test $ y [[2]]'などを使います(二重括弧に注意してください)。 – MrFlick

答えて

0

厄介なこともありますが、それはかなり簡単です。正しい軌道に乗っていましたが、unlist()を追加し、にlapply()を使用すると、あなたが望むものが得られます。

test$y <- lapply(1:length(test$x),function(i) unlist(strsplit(test$x[[i]],"-")))

test$y[[1]]

[1] "5353"、 "66"

+0

lapply関数でループを実行できるかどうかはわかりませんでした。ありがとうございました。 – wjang4

0

sapplyの魔法が便利になるところです -

あなたが何
test <- data.frame(x = c("5353-66", "55-110-4000","6524-533", "62410-165", "653-520-2410")) 
test$x <- as.character(test$x) 

sapply(test$x,strsplit,'-') 

$`5353-66` 
[1] "5353" "66" 

$`55-110-4000` 
[1] "55" "110" "4000" 

$`6524-533` 
[1] "6524" "533" 

$`62410-165` 
[1] "62410" "165" 

$`653-520-2410` 
[1] "653" "520" "2410" 

ここからのデータはあなた次第です。データが不揃いである、つまり、行ごとに固定数のセルが必要な長方形の行列やデータフレームに収まらない場合は、データをリストとして保持する必要があります。実際のデータフレームはリストなので、多くのデータフレーム関数が同様に機能します。

あなたは、データフレームを持っている必要があります場合は、あなたが不足している細胞のためのNASで追加してから、ワイドフォーマットのデータフレームに戻って、それを変換することができます:

 out_list <- sapply(test$x,strsplit,'-') 

     max_length <- max(sapply(out_list,length)) 


     out_list <- lapply(out_list, function(x) { 
     if(length(x)<max_length) { 
      x <- c(x,rep(NA,times=max_length-length(x))) 
     } 
     return(x) 
     }) 

     out_data <- as.data.frame(out_list) 


     X5353.66 X55.110.4000 X6524.533 X62410.165 X653.520.2410 
     1  5353   55  6524  62410   653 
     2  66   110  533  165   520 
     3  <NA>   4000  <NA>  <NA>   2410