通过子集化和列绑定重新排列数据帧

时间:2016-02-04 17:18:59

标签: r dataframe tidyr cbind

我有以下数据框:

st <- data.frame(
      se = rep(1:2, 5),
      X = rnorm(10, 0, 1),
      Y = rnorm(10, 0, 2))
st$xy <- paste(st$X,",",st$Y)
st <- st[c("se","xy")]

但我希望它如下:

1   2   3   4   5
-1.53697673029089 , 2.10652020463275    -1.02183940974772 , 0.623009466458354   1.33614674072657 , 1.5694345481646  0.270466789820086 , -0.75670874554064   -0.280167896821629 , -1.33313822867893
0.26012874418111 , 2.87972571647846 -1.32317949800031 , -2.92675188421021   0.584199000313255 , 0.565499464846637   -0.555881716346136 , -1.14460518414649  -1.0871665543915 , -3.18687136890236

我的意思是当se的值相同时,请进行列绑定。

您有什么想法如何实现这一目标? spread(tidyr)我没有运气,我猜这涉及sapplycbindif声明。因为真实数据涉及超过35.000行。

2 个答案:

答案 0 :(得分:0)

如果我们需要拆分&#39; xy&#39;将列元素转换为单个单元,可以使用cSplit中的splitstackshape。然后rbind交替排列&#39; st1&#39}。在unlist ing`之后。

library(splitstackshape)
st1 <- cSplit(st, 'xy', ', ', 'wide')
 rbind(unlist(st1[c(TRUE,FALSE)][,-1, with=FALSE]), 
    unlist(st1[c(FALSE, TRUE)][,-1, with=FALSE]))

如果我们不需要split&#39; xy&#39;将列添加到单个元素中,我们可以使用dcast中的data.table。它应该足够快。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(st),按&#39;&#39;创建序列列(&#39; N&#39;),然后从&#39;长&#39;到&#创建dcast 39;宽&#39;

library(data.table)
dcast(setDT(st)[, N:= 1:.N, se], se~N, value.var= 'xy')

答案 1 :(得分:0)

似乎您的最终目标是拥有一个大约35000列的数据文件。你确定吗?这听起来不是tidy

要做你想做的事,你需要有一个行标识符。在下面,我称之为caseid,然后在不再需要它时删除它。然后我转换结果以获得你要求的内容。

library(tidyr)
library(dplyr)

st <- data.frame(
  se = rep(1:2, 5),
  X = rnorm(10, 0, 1),
  Y = rnorm(10, 0, 2))
st$xy <- paste(st$X,",",st$Y)
st <- st[c("se","xy")]
st$caseid = rep(1:(nrow(st)/2), each = 2) # temporary

df = spread(st, se, xy) %>%select(-caseid) %>%t()
print(df)