1

有了这个数据

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"))

如何正确地做到这一点?

4

3 回答 3

3

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

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和“时间”变量。

于 2013-08-26T06:50:20.457 回答
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
    })
于 2013-08-26T04:01:09.480 回答
1

从这里的答案开始:

R:在 data.frame 列中拆分不平衡列表

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)
于 2013-08-26T04:05:54.510 回答