通过分隔符拆分列并复制R中的相关行

时间:2013-08-26 03:33:30

标签: r split dataframe

使用此数据

foo 5 49 10
bar 1,2 22 11

我想将行拆分为第二列,以便最终输出给出:

foo 5 49 10
bar 1 22 11
bar 2 22 11

我尝试了colsplit但还没有完成:

 lines <- "
      foo 5 49 10
      bar 1,2 22 11"
 con <- textConnection(lines)
 dat<-read.table(con)
 colsplit(t$V2,",",c("F1","F2","F3","F4"))

如何正确完成这项工作?

3 个答案:

答案 0 :(得分:3)

假设您的data.frame被称为“mydf”,您可以使用我的“splitstackshape”软件包中的concat.split.multiple

install.packages("splitstackshape")
library(splitstackshape)
concat.split.multiple(mydf, "V2", direction = "long")
#    V1 V3 V4 time V2
# 1 foo 49 10    1  5
# 2 bar 22 11    1  1
# 3 foo 49 10    2 NA
# 4 bar 22 11    2  2

如果需要,您可以轻松删除V2为NA的结果行和“时间”变量。

答案 1 :(得分:1)

你可以试试这些代码,虽然它不是聪明的方法:

lines <- "
      foo 5 49 10
      bar 1,2 22 11"
con <- textConnection(lines)
dat<-read.table(con, as.is = TRUE)
library(plyr)
ddply(dat, .(V1), function(df)
    {
        if (length(grep(',', df$V2)) > 0)
        {
            V2 <- strsplit(as.character(df$V2), ',')[[1]]
            df <- df[rep(1, length(V2)),]
            df$V2 <- V2
        }
        df
    })

答案 2 :(得分:1)

从这里回答:

R: Split unbalanced list in data.frame column

temp <- strsplit(as.character(dat$V2),",",fixed=TRUE)
n <- sapply(temp, length)
dat2 <- dat[rep(seq_len(nrow(dat)),times=n),]
dat2$V2 <- unlist(temp)