2017-09-13 196 views
0

考慮我有一個數據框在三列長格式。 x列包含3個變量的名稱,yz包含2個等級。有重複測量每個y變量:如何將長數據幀轉換爲寬重複數據/重複數據幀?

df <- data.frame(x=c(1:12), y=rep(0:2, 4), z=rep(letters[1:2], 6)) 
df$y <- as.factor(df$y) 
df <- arrange(df, y, z) 
df 

    x y z 
1 1 0 a 
2 7 0 a 
3 4 0 b 
4 10 0 b 
5 5 1 a 
6 11 1 a 
7 2 1 b 
8 8 1 b 
9 3 2 a 
10 9 2 a 
11 6 2 b 
12 12 2 b 

我怎樣才能得到df_wide這個樣子?

z 0 1 2 
a 1 5 3 
a 7 11 9 
b 4 2 6 
b 10 8 12 
+0

你能否解釋這到底是怎麼回事? – mtoto

+0

在df中,column-x是測量值,column-y是3個變量,column-z包含2個級別,並且每個列都具有用於列y變量的重複測量。希望這是明確的:)謝謝@ mtoto – datanew

回答

1
do.call(cbind, lapply(split(df, df$y), function(a) 
    setNames(object = data.frame(a$x, 
           row.names = paste0(as.character(a$z), 1:NROW(a))), 
      nm = a$y[1]))) 
# 0 1 2 
#a1 1 5 3 
#a2 7 11 9 
#b3 4 2 6 
#b4 10 8 12 
+0

謝謝!實際上,我有一個dfs列表。這個df是我列表中的一個元素。我如何在列表中實現do.call(...)代碼? – datanew

1

data.table包裝就變成了 「單行程序」 使用dcast()rowid()功能:

library(data.table) 
dcast(setDT(df), paste0(z, rowid(y, z)) ~ y, value.var = "x") 
z 0 1 2 
1: a1 1 5 3 
2: a2 7 11 9 
3: b1 4 2 6 
4: b2 10 8 12 
+0

作品!謝謝! – datanew