2011-07-08 3 views
3

私は数千の行といくつかの列を持つcsvファイルを取得します。 は、ファイルがどのようなものであるかの一例として、以下を参照してください。Rで生成したテーブルに基づいて新しいデータフレームを作成するにはどうすればよいですか?

Subject  Duration  
A    1.3 
B    6.7 
C    3.2 
A    2.5 
D    2.7 
E    99  
F    8.4 
G    12.5 
H    19.7 
Z    3.2 
A    56  
B    9.4 
.    .  
.    .  
.    .  

同じテーマのため、期間が異なる場合がありますことに注意してください。 私は私が手動で一つ一つの件名を入力することはできませんので、多くの対象タイトルを持っている など、例えば、私は被験者A、被験者Bの総所要時間の合計時間を知りたい、それぞれ特定の主題についての期間を追加します答えを求めてください。 私は、各サブジェクトの期間の合計を見つけて、新しいデータフレームまたは合計期間に対応するサブジェクト名を持つ新しいファイルを作成します。

は、事前にどうもありがとうございました!!!!!! AA変数は、あなたのdata.frame

答えて

1

あなたはplyrパッケージ

ddply(aa, "Subject", summarise, POSITION=sum("Duration")) 

を使用することができます

の場合私はあなたの質問を理解しています。たとえば、total_durationという3番目の列に、各サブジェクトのすべての期間の合計が含まれていることを追加したいとします。このために、merge関数は非常に役に立ちます。上記の計算結果を新しい変数total_durationsとして保存しました。今、3つの列でdata.frameを作成し、それをファイルに書き込むために、上記の例では、データ型については

result <- merge(d,total_durations, by="subject") 
write.csv(result, "file.csv", row.names=FALSE) 

を行い、変数dtotal_durationsresultdata.frameオブジェクトです。一方、fは、各被験者の所見との関係を記述する関数である。 fの他の妥当な定義は、

f <- function(df) nrow(df) # counts the observations per subject 
f <- function(df) mean(df$duration) # calculates the mean duration for each subject 
2

これは、パッケージplyr

#install.packages("plyr") 
library(plyr) 
d <- data.frame(
    subject=c("A", "B", "C", "A", "D", "E", "F", "G", "H", "Z", "A", "B"), 
    duration=c(1.3, 6.7, 3.2, 2.5, 2.7, 99, 8.4, 12.5, 19.7, 3.2, 56, 9.4) 
) 
f <- function(df) sum(df$duration) 
total_durations <- ddply(d, .(subject), f) 

更新のために発明されたタスクである場合

+0

はどうもありがとうございました!それは非常に便利です!私はこの議論が私が望む結果を持つ3つの列を作り出したことを知ります。しかし、これらの3つの列は「データフレーム」と呼ばれていますか?もしそうなら、 "f"は何を意味し、この新しいcolumn/data.frameの名前をつけることができますか?他に何かを生み出すためには結果が必要なので、その名前を知っているか、ファイルに変換する必要があります。もう一度ありがとう:) – Susie

5

です。私はKarstenの例を借りました。

実際にはsubjectに従ってdata.frameを分割しています。これはlapplyを使用して、リスト

split(d, d$subject) 

$A 
    subject duration 
1  A  1.3 
4  A  2.5 
11  A  56.0 

$B 
    subject duration 
2  B  6.7 
12  B  9.4 

$C 
    subject duration 
3  C  3.2 

になり、私は、各リスト要素と合計欄durationをめくります。私はna.rm = TRUEを追加して、関数がまだNAsが存在していても合計するようにしました。

私はあなたがよりコンパクトなものにリストを変換するためにdata.frameで結果をunlistまたは置くことができる1行に

lapply(split(d, d$subject), function(x) sum(x$duration, na.rm = TRUE)) 

$A 
[1] 59.8 

$B 
[1] 16.1 

$C 
[1] 3.2 

これを提示します。

unlist(lapply(split(d, d$subject), function(x) sum(x$duration, na.rm = TRUE))) 
    A B C D E F G H Z 
59.8 16.1 3.2 2.7 99.0 8.4 12.5 19.7 3.2 
+6

なぜ 'sapply(split(d $ duration、d $ subject)、sum、na.rm = TRUE)'? – Marek

+0

さらに良い。提案していただきありがとうございます。 –

関連する問題