0

次のようなデータフレームがあります。

 GN  SN  
  a   b   
  a   b   
  a   c   
  d   e   
  d   f 
  d   e

次の出力が必要です:
GN: a SN: 2 b 1 c
GN d SN: 2 e 1 f

つまり、列 SN に data.frame の一種の table() を配置したいと考えています。まず、$GN に従って data.frame を分割したので、ブロックができました。この時点で、私が行った分割に従って列 SN の要素をカウントすることはできません。「適用」機能はこれを行う方法ですか?また、分割機能に属する一般的な出力を保存するにはどうすればよいですか?

前もって感謝します

4

1 に答える 1

0

あなたのデータで:

df <- data.frame(GN = rep(c("a","b"), each = 3),
                 SN = c(rep("b", 2), "c", "e", "f", "e"))

私たちにできること:

> lapply(with(df, split(SN, GN)), table)
$a

b c e f 
2 1 0 0 

$b

b c e f 
0 0 2 1

ただし、すべてのレベル(0エントリ)が必要ない場合は、空のレベルを削除する必要があります。

> lapply(with(df, split(SN, GN)), function(x) table(droplevels(x)))
$a

b c 
2 1 

$b

e f 
2 1

個々のテーブルをファイルに書き出す

これは完璧ではありませんが、少なくともあなたはそれで作業することができます

## save tables
tmp <- lapply(with(df, split(SN, GN)), function(x) table(droplevels(x)))

## function to write output to file `fname`
foo <- function(x, fname) {
    cat(paste(names(x), collapse = " "), "\n", file = fname, append = TRUE)
    cat(paste(x, collapse = " "), "\n", file = fname, append = TRUE)
    invisible()
}

fname <- "foo.txt"
file.create(fname)                # create file fname
lapply(tmp, foo, fname = fname)   # run our function to write to fname

それは与える:

R> readLines(fname)
[1] "b c " "2 1 " "e f " "2 1 "

またはOSから:

$ cat foo.txt
b c 
2 1 
e f 
2 1 
于 2012-11-02T16:33:39.213 に答える