【问题标题】:Rearrange dataframe by subsetting and column bind [duplicate]通过子集和列绑定重新排列数据框
【发布时间】:2016-05-14 10:41:55
【问题描述】:

我有以下数据框:

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 声明。因为真实数据涉及超过 35000 行。

【问题讨论】:

  • 试试看,library(dplyr); st %&gt;% group_by(se) %&gt;% mutate(idx = row_number()) %&gt;% spread(idx, xy)
  • 感谢@docendodiscimus ,它运行良好!
  • 不明白mutate中的idx参数是什么?
  • 它在每组se中创建一个索引列,从1、2、3、...开始计数。然后将该索引用作扩展 xy 列的键。只需删除最后一个管道元素即可查看它的确切作用

标签: r dataframe tidyr cbind


【解决方案1】:

您的最终目标似乎是拥有一个包含大约 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)

【讨论】:

    【解决方案2】:

    如果我们需要将“xy”列元素拆分为单独的单元,可以使用cSplitsplitstackshape。然后rbindunlisting`之后'st1'的交替行。

    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 'xy' 列分成单个元素,我们可以使用dcast from data.table。它应该足够快。将'data.frame'转换为'data.table'(setDT(st),通过'se'创建一个序列列('N'),然后将dcast从'long'转换为'wide'。

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

    【讨论】:

      猜你喜欢
      • 2019-11-12
      • 2019-02-12
      • 2017-08-03
      • 2022-01-22
      • 1970-01-01
      • 2017-02-13
      • 2019-07-20
      • 2016-07-02
      • 1970-01-01
      相关资源
      最近更新 更多