使用此数据
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"))
如何正确完成这项工作?
答案 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)