2016-04-14 55 views
2

我在數據幀2列,請參閱下面創建R中多列基於其他列

no value 
1 A_0.9 
1 B_0.8 
1 C_0.7 
1 D_0.7 
2 B_0.9 
2 D_0.8 
2 A_0.7 
2 C_0.7 

我要創建新的數據幀如下

no value1 value2 value3 value4 
1 A_0.9 B_0.8 C_0.7 D_0.7 
2 B_0.9 D_0.8 A_0.7 C_0.7 

即:對在「否」列中的每個唯一值將會有使用列「值」中的數據創建的多個列

+1

對於更好地重新格式化數據以便人們可以更輕鬆地查看列的內容會很有趣。就我個人而言,我無法在您的表示中看到雙列數據框。這樣做可能會增加獲得正確答案的機會。 – Eduardo

+0

好的,我從excel中複製數據,但是當我發佈這個問題時,它採用了文本格式。我將複製一個粘貼山坳一個讓我知道,如果這有助於理解數據的廣告要求,我在數據幀2列,請參閱以下 西1:沒有西2:值 A_0.9 B_0.8 C_0.7 D_0.7 B_0.9 D_0.8 A_0.7 C_0.7 我要創建新的數據幀如下Col 1:否西2:VALUE1 A_0.9 B_0.9 西3:VALUE2 B_0.8 D_0.8 第4欄:VALUE3 C_0.7 A_0.7 第5欄:VALUE4 D_0.7 C_0 .7 – user3734568

回答

1

使用data.table,我們可以通過no創建的每一個獨立value序列與rleid(),因此用它來dcast()數據以寬幅。

library(data.table) 
dcast(setDT(df)[, nr := rleid(value),by = no], no ~ nr) 
# no  1  2  3  4 
#1 1 A_0.9 B_0.8 C_0.7 D_0.7 
#2 2 B_0.9 D_0.8 A_0.7 C_0.7 

或與data.tabledev version (1.9.7),以下是可能的,感謝@Arun!

dcast(setDT(df), no ~ rowid(no, prefix = 'value')) 
# no value1 value2 value3 value4 
#1: 1 A_0.9 B_0.8 C_0.7 D_0.7 
#2: 2 B_0.9 D_0.8 A_0.7 C_0.7 
+0

感謝mtoto分享此。 – user3734568

+0

不用客氣,請記住,這個解決方案比'unstack'方法快大約x400。 – mtoto

+0

我已經試過並注意到上面的代碼對於我在共享的數據框示例中列「no」中可用的每個組的不平等觀察將非常有用。您分享的代碼對於較小的數據集完美工作,但是當我在大型數據集上嘗試這些代碼時,我收到消息「使用'nr'作爲值列,使用'value.var'替代 缺少聚合函數,長度'」。不知道這些是什麼,我沒有得到要求的數據幀。以下是我使用的代碼。檢查< - dcast(setDT(raw.data)[,nr:= rleid(Value),by = no],no〜nr) – user3734568

2
t(unstack(df, value ~ no)) 
# [,1] [,2] [,3] [,4] 
#X1 "A_0.9" "B_0.8" "C_0.7" "D_0.7" 
#X2 "B_0.9" "D_0.8" "A_0.7" "C_0.7" 

要整理一個波夫輸出以滿足您的數據,

library(dplyr) 
df1 <- as.data.frame(t(unstack(df, value ~ no))) 
names(df1)[-1] <- paste0('value', 2:ncol(df1)-1) 
rownames(df1) <- NULL 
df1 <- add_rownames(df1, 'no') #from dplyr package 
# no value1 value2 value3 value4 
# (chr) (fctr) (fctr) (fctr) (fctr) 
#1  1 A_0.9 B_0.8 C_0.7 D_0.7 
#2  2 B_0.9 D_0.8 A_0.7 C_0.7 
+0

這是完美的工作,我只有一個查詢可能有超過4個值爲每個唯一的數字在列「否」,因此命名該列有任何其他方式 – user3734568

+0

@ user3734568,請參閱編輯的答案。 – Sotos

+0

非常感謝您的回覆。 – user3734568

0

我會使用reshape庫,它包裝了一套很好的數據處理函數。要完成您的任務的示例:

n = c(1,1,1,1,2,2,2,2) 
x = c('A', 'B', 'C', 'D', 'A', 'B', 'C', 'D') 
# Just to create the column names you showed in the example 
columns = rep(paste("value", 1:4, sep=""), 2) 
data = data.frame(n, columns, x) 
cast(data, n~columns) 
+1

您在這裏定義'columns'的方式僅適用於示例數據集,因此不可擴展。 – mtoto