将数据从3行重组为1

Ray*_*Ray 7 csv r reshape2

我需要重新组织包含大多数重复数据的csv文件中的数据.我将数据导入到数据帧中的R但是我遇到以下问题:

ID   Language  Author   Keyword
12   eng       Rob      COLOR=Red
12   eng       Rob      SIZE=Large
12   eng       Rob      DD=1
15   eng       John     COLOR=Red
15   eng       John     SIZE=Medium
15   eng       John     DD=2
Run Code Online (Sandbox Code Playgroud)

我需要做的是将其转换为一行,每个关键字都在一个单独的列中

ID   Language  Author  COLOR  SIZE      DD
12   eng       Rob     Red    Large     1
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Bri*_*ggs 7

使用这个reshape2包很简单:

随着tt定义为加里的答案

library("reshape2")

tt <- cbind(tt, colsplit(tt$Keyword, "=", c("Name", "Value")))
tt_new <- dcast(tt, ID + Language + Author ~ Name, value.var="Value")
Run Code Online (Sandbox Code Playgroud)

这使

> tt_new
  ID Language Author COLOR DD   SIZE
1 12      eng    Rob   Red  1  Large
2 15      eng   John   Red  2 Medium
Run Code Online (Sandbox Code Playgroud)


ags*_*udy 6

使用plyrans strsplit你可以做这样的事情:

library(plyr)
res <- ddply(dat,.(ID,Language,Author),function(x){
        unlist(sapply(strsplit(x$Keyword,'='),'[',2))
})

colnames(res)[4:6] <- c('COLOR','SIZE','DD')

 ID Language Author COLOR   SIZE DD
1 12      eng    Rob   Red  Large  1
2 15      eng   John   Red Medium  2
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个解决@Brian关注的概括:

res <- ddply(dat,.(ID,Language,Author), function(x){
             kv <- strsplit(x$Keyword, '=')
             setNames(sapply(kv, `[`, 2),
                      sapply(kv, `[`, 1)) })
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,这确实假设关键字总是"COLOR","SIZE"和"DD",并始终按此顺序排列.如果这个假设是正确的,那么这很好. (2认同)