2017-03-07 5 views
0

strsplit()の結果に応じてデータフレームの列でstrsplit()を呼び出すと、結果として1つまたは2つの「サブリスト」が取得されることがあります分割の例えば、リスト内の可変長リストにアクセスする方法R

v <- c("50", "1 h 30 ", "1 h", NA) 
split <- strsplit(v, "h") 
[[1]] 
[1] "50" 

[[2]] 
[1] "1" " 30" 

[[3]] 
[1] "1 " 

[[4]] 
[1] NA 

は、私が「[]」を使用して、スプリットの個々のリストにアクセスすることができます知っていると「[[]]」私にこれらのサブリストの内容を伝えますので、私は、私はそれを理解すると思います。そして私は分割[2] [2]をすることで[30]の "30"にアクセスすることができます。

残念ながら、私はこのプログラムに、私が持っている列全体にアクセスする方法がわかりません。列を数値データに変換しようとしています。しかし、その "1時間30"のケースは私に多くのトラブルを与えている。

func1 <- function(x){ 
    split.l <- strsplit(x, "h") 
    len <- lapply(split.l, length) 
    total <- ifelse(len == 2, as.numeric(split.l[2]) + as.numeric(split.l[1]) * 60, as.numeric(split.l[2])) 
    return(total) 
} 

v <- ifelse(grepl("h", v), func1(v), as.numeric(v)) 

私が知っているのは、分割の長さのベクトルを返します。しかし、実際に個々のサブリストの2番目の要素に実際にアクセスする場合、私は単にそれを正しく行う方法を知らないだけです。 split.l [1]とsplit.l [2]は、元のデータフレーム列全体の最初の2つの要素のみを返すため、エラーが発生します。 [[1]]と[[2]]はどちらも動作しません。私は[1] [1] [2]のようなものが必要です。しかし、私はforループを使用せず、反復しようとしています。

長い話を短くするために、私は参考のために、プログラム

内側のリストの要素にアクセスしますどのように、私が助けたこれを見ました。しかし、私はまだそれを解決することができませんでした。 apply strsplit to specific column in a data.frame

私は本当にRでリストとリスト処理に苦労していますので、何か助けに感謝します。

答えて

0

共通のイディオムはあなたの例に適用され、lapply(l, [, 2)でいます:それは可能であれば

> lapply(split, `[`, 2) 
[[1]] 
[1] NA 

[[2]] 
[1] " 30 " 

[[3]] 
[1] NA 

[[4]] 
[1] NA 

sapply()は、ベクターにこれを崩壊します。行われているのは何

lapply()これはあなたの擬似コード—の[[i]]ビットであり、我々はn番目の要素を抽出したいそれらのそれぞれに順番—にsplitの各コンポーネントを取るです。この例では[関数を引数n —として適用します(2L)。

秒かかり、その場合には2番目の要素は、存在しない限り、あなたが最初の要素をしたい場合は、あなただけの代わりに直接[を使用してのラッパーを書くことができます:

> lapply(split, wrapper) 
[[1]] 
[1] "50" 

[[2]] 
[1] " 30 " 

[[3]] 
[1] "1 " 

[[4]] 
[1] NA 
を与える
wrapper <- function(x) { 
    if(length(x) > 1L) { 
     x[2L] 
    } else { 
     x[1L] 
    } 
} 

lapply(split, wrapper) 

または多分

lens <- lengths(split) 
out <- lapply(split, `[`, 2L) 
ind <- lens == 1L 
out[ind] <- lapply(split[ind], `[`, 1L) 
out 

それはからの出力をループが2回。

関連する問題