4

私はR(〜3か月)で比較的新しいので、すべての異なるデータ型のコツをつかんでいます。リストは、異なるデータをすべて1つの場所に保持するための非常に便利な方法ですが、関数呼び出しには非常に柔軟性がなく、不安を抱えています。

私が行っている作業では、さまざまな長さのベクトルの束を保持する必要があるため、リストをよく使用します。たとえば、私は約10,000台の異なる車両のパフォーマンス統計を追跡していますが、特定の分析では基本的に同じ車両として扱うことができる非常に類似した特定の車両があります。

したがって、次の車両IDのリストがあるとします。

List <- list(a=1, b=c(2,3,4), c=5)

簡単にするために。

私は2つのことをしたい:

  1. 特定の車両がリストのどの要素に含まれているかを教えてください。したがって、Rに車両を使用して2いると伝えるとb、またはが表示され[2]ます。どうすればいいのかというようなシンプルなものにすべきだと思います

    match(3,b)
    > 2
    
  2. CSVとして保存できるように、データフレームなどに変換します。未使用の行は空白またはNA。私がこれまでにやらなければならなかったことは次のとおりです。

    for(i in length(List)) {
    length(List[[i]]) <- max(as.numeric(as.matrix(summary(List)[,1])))
    }
    DF <- as.data.frame(List)
    

ばかげているようです。

4

2 に答える 2

4

データをdata.frameに「フラット化」すると、これらのタスクの両方(および他の多くのタスク)がはるかに簡単になります。これを行う1つの方法は次のとおりです。

fun <- function(X) 
    data.frame(element = X, vehicle = List[[X]], stringsAsFactors = FALSE)
df <- do.call(rbind, lapply(names(List), fun))
#   element vehicle
# 1       a       1
# 2       b       2
# 3       b       3
# 4       b       4
# 5       c       5

data.frameが手元にある場合、2つのタスクを実行する方法は次のとおりです。

## Task #1
with(df, element[match(3, vehicle)])
# [1] "b"

## Task #2
write.csv(df, file = "outfile.csv")
于 2012-10-23T22:57:03.590 に答える
4

あなたの最初の質問のために:

which(sapply(List, `%in%`, x = 3))
# b 
# 2 

2番目の質問では、次のような関数を使用できます。

list.to.df <- function(arg.list) {
   max.len  <- max(sapply(arg.list, length))
   arg.list <- lapply(arg.list, `length<-`, max.len)
   as.data.frame(arg.list)
}
list.to.df(List)
#    a b  c
# 1  1 2  5
# 2 NA 3 NA
# 3 NA 4 NA
于 2012-10-23T23:21:59.647 に答える