将列拆分为相邻列,使用行名作为R中的新列名

Ste*_*ect 4 split r transformation

我有一个数据框,包含两列标识信息和一列用连字符分隔的字母对:

df<-data.frame(
    list = rep(1:3, each = 2),
    set =  rep(c("A","B"), times = 3),
    item = c("ab-cd","ef-gh","ij-kl","mn-op","qr-st","uv-wx")  
    )
Run Code Online (Sandbox Code Playgroud)

我一直在努力完成的是将数据框转换为以下形式,其中:1.由"list"索引的单独行每个都折叠成一行; 2."item"列被分成相邻的列,连字符为分隔符; 3."set"列,用作命名结果列的基础.

df2 <- data.frame(
       list = c(1:3),
       A_1 = c("ab", "ij", "qr"),
       A_2 = c("cd", "kl", "st"),
       B_1 = c("ef", "mn", "uv"), 
       B_2 = c("gh", "op", "wx"))
Run Code Online (Sandbox Code Playgroud)

我已经提到了一些以前发布的问题(特别是[这里]),并尝试使用BASE转置函数以及各种绑定函数以及reshape包和splitstackshape包逐步处理解决方案.我的近乎解决方案都不优雅,我想知道是否有一个很好的方法来做到这一点.

一如既往,我非常感谢社区提供建议和反馈.

Her*_*oka 5

非常感谢@AnandaMahto:它可以通过首先重塑然后分裂而不是相反的方式在一行中完成.

library(splitstackshape)
cSplit(dcast(as.data.table(df), list ~ set, value.var = "item"), c("A", "B"), "-")
Run Code Online (Sandbox Code Playgroud)

我们可以使用base R和reshape2分两步完成.

首先,我们创建包含拆分项的列'1'和'2'.通常情况下,我们不会使用数字字符来启动列名,但它为我们节省了稍后重命名结果列的步骤.

df[,c("1","2")] <- do.call(rbind,strsplit(as.character(df$item),"-"))
Run Code Online (Sandbox Code Playgroud)

然后我们使用recast:

res <- recast(data=df, list~set+variable, measure.var=c("1","2"))
res

  list A_1 A_2 B_1 B_2
1    1  ab  cd  ef  gh
2    2  ij  kl  mn  op
3    3  qr  st  uv  wx
Run Code Online (Sandbox Code Playgroud)