2010-08-12 41 views
5

我剛剛開始超越R中的基礎知識,並且已經到了需要一些幫助的地步。我想重新調整一些數據。下面是一個示例數據框可能是什麼樣子:重構R中的數據

ID Sex Res Contact 
1 M MA ABR 
1 M MA CON 
1 M MA WWF 
2 F FL WIT 
2 F FL CON 
3 X GA XYZ 

我想要的數據看起來像:

ID SEX Res ABR CON WWF WIT XYZ 
1 M MA 1 1 1 0 0 
2 F FL 0 1 0 1 0 
3 X GA 0 0 0 0 1 

我有哪些選擇?我如何在R中做到這一點?

簡而言之,我期望保留CONT列的值並將它們用作重構數據框中的列名稱。我想持有一個可變的列集合(在上面的例子中,我擁有ID,Sex和Res常量)。

另外,是否可以控制重新構造的數據中的值?我可能想保留數據爲二進制。我可能希望某些數據的值是每個ID的每個聯繫人值的存在次數。

回答

12

reshape包是你想要的。文檔在這裏:http://had.co.nz/reshape/。不嘟我自己的號角,但我也寫了一些筆記上reshape的使用位置:http://www.ling.upenn.edu/~joseff/rstudy/summer2010_reshape.html

你的目的,此代碼應工作

library(reshape) 
data$value <- 1 
cast(data, ID + Sex + Res ~ Contact, fun = "length") 
+0

我一直在使用的R用了很長時間,我從來不知道你能做到數據$值< - 1,而不是數據$值< - 代表(1 nrow(數據))。不能相信我從來沒有嘗試過 - 這是否始終有效? – 2010-08-12 18:19:28

+0

@Daniel你也應該試試'data $ variable < - 1;數據$變數[數據$組==「A」] < - 2' – JoFrhwld 2010-08-12 18:43:42

+0

我知道哈德利的重塑套餐可能是答案,但我很難得到我的頭。在你的代碼中,賦值爲1的數據$值是做什麼的? – Btibert3 2010-08-12 19:27:51

2

model.matrix的偉大工程(這是問最近,和gappy had this good answer):

> model.matrix(~ factor(d$Contact) -1) 
    factor(d$Contact)ABR factor(d$Contact)CON factor(d$Contact)WIT factor(d$Contact)WWF factor(d$Contact)XYZ 
1     1     0     0     0     0 
2     0     1     0     0     0 
3     0     0     0     1     0 
4     0     0     1     0     0 
5     0     1     0     0     0 
6     0     0     0     0     1 
attr(,"assign") 
[1] 1 1 1 1 1 
attr(,"contrasts") 
attr(,"contrasts")$`factor(d$Contact)` 
[1] "contr.treatment" 
+0

Eark!誤解了這個問題。你可以使用我的答案,然後使用'tapply',但JoFrhwld的答案更容易。 – Vince 2010-08-12 20:20:30