4

同じフィールドで繰り返すことができるさまざまな数の要素を含む長いリストがあります。
これは最初の5行の例です。

A <- list(c("JAMES","CHARLES","JAMES","RICHARD"),  
          c("JOHN","ROBERT","CHARLES"),  
          c("CHARLES","WILLIAM","CHARLES","MICHAEL","WILLIAM","DAVID","CHARLES","WILLIAM"),  
          c("CHARLES"),  
          c("CHARLES","CHARLES"))  

次に、リストの各行の要素数を計算します。
私の希望する出力は次のようになります。

[1] 4  
[2] 3  
[3] 7  
[4] 1  
[5] 2  

それに加えて、「CHARLES」という用語が各行に出現する頻度を知りたいです。
私の例に基づいて、次のような出力を取得したいと思います。

[1] 1  
[2] 1  
[3] 3  
[4] 1  
[5] 2  

私はこれについて考えました:

> table(A)  
Error in table(A) : all arguments arguments must have same length  
> sum(A)  
Error in sum(A) : invalid 'type' (list) of argument  

しかし、残念ながら、これらのエラーメッセージをどうすればよいかわからず、代替案もわかりません。
リストの行数は次のとおりです。

> length(A)  
[1] 5  

しかし、残念ながら、これは私の質問に答えません。他の答えも見つかりませんでした。
したがって、これら2つの測定値の計算を手伝ってください。

事前にどうもありがとうございました!

4

3 に答える 3

6
sapply(A, function(x) length(x))
[1] 4 3 8 1 2
un <- unique(unlist(A))
nm <- lapply(un, function(x) sapply(A, function(y) sum(y == x)))
names(nm) <- un
nm
$JAMES
[1] 2 0 0 0 0

$CHARLES
[1] 1 1 3 1 2

$RICHARD
[1] 1 0 0 0 0

$JOHN
[1] 0 1 0 0 0

$ROBERT
[1] 0 1 0 0 0

$WILLIAM
[1] 0 0 3 0 0

$MICHAEL
[1] 0 0 1 0 0

$DAVID
[1] 0 0 1 0 0
于 2012-06-15T09:48:57.380 に答える
6

リストに精通しlapplysapplyループする必要があります。

sapply(A, length)
[1] 4 3 8 1 2

sapply(A, function(x)sum(grepl("CHARLES", x)))
[1] 1 1 3 1 2

grepl()正規表現をテキストに一致させ、一致するかどうかに応じてTRUEまたはFALSEを返します。次に、sum()これらの論理値を上書きします。つまり、真理値を合計します。

于 2012-06-15T09:48:59.243 に答える
3

リストAの要素の長さを計算するには、次のコマンドを使用できます。

list.len <- lapply(1:length(A),function(x) length(A[[x]]))
unlist(list.len)
[1] 4  
[2] 3  
[3] 7  
[4] 1  
[5] 2  

リストの各要素に「CHARLES」が表示される回数を計算するには、次のようにします。

len.name <- lapply(1:length(A),function(x) length(which(A[[x]] == "CHARLES")))
len.name
[[1]]
[1] 1

[[2]]
[1] 1

[[3]]
[1] 3

[[4]]
[1] 1

[[5]]
[1] 2

その後、リストから外すことができます

unlist(len.name)

次に、出力は次のようになります。

[1] 1  
[2] 1  
[3] 3  
[4] 1  
[5] 2  
于 2012-06-15T10:27:23.557 に答える