2011-04-06 27 views
2

我有一個表以下行是否有類似於colsplit的命令,但將單元格拆分到同一列但不同的行?

df <- data.frame(Time=c(1,3),date=c(23,12), 
     people=c("Apple&June&Peter","Apple&May&Mary"),stringsAsFactors=FALSE) 

Time date people 
1 23 Apple&June&Peter 
3 12 Apple&May&Mary 

我需要將它們分成不同的行:

Time date people 
1 23 Apple 
1 23 June 
1 23 Peter 
3 12 Apple 
3 12 May 
3 12 Mary 

我知道重塑+ colsplit可用於人列拆分成不同的列同一排。

行怎麼樣?我怎樣才能將他們分成不同的行,但同一列?

+1

幾乎相同http://stackoverflow.com/questions/5564292/replacing-and-sybmbols-in-a-matrix – Andrie 2011-04-06 17:03:44

回答

1
df <- data.frame(Time=c(1,3),date=c(23,12), 
      people=c("Apple&June&Peter","Apple&May&Mary"),stringsAsFactors=FALSE) 
long.people=strsplit(df$people,"&") 
el.len=sapply(long.people,length) 
new.df=data.frame(Time=rep(df$Time,el.len),date=rep(df$date,el.len),people=unlist(long.people))  
new.df 
     Time date people 
    1 1 23 Apple 
    2 1 23 June 
    3 1 23 Peter 
    4 3 12 Apple 
    5 3 12 May 
    6 3 12 Mary 
0

您可以使用colsplit然後重塑導致data.frame回到多頭形態,那麼就刪除ID列的重塑創造:

library(reshape) 
df <- data.frame(time=c(1,3),date=c(23,12),people=c("Apple&June&Peter","Apple&May&Mary")) 
pnames <- paste("people",seq(3),sep=".") 
df.new <- cbind(df[,seq(2)],colsplit(df$people,"&",pnames)) 
df.new <- reshape(df.new,varying=pnames,direction="long") 
df.new <- subset(df.new,select=c(-id)) 

df.new 
    time date people 
1.1 1 23 Apple 
2.1 1 12 Apple 
1.2 2 23 June 
2.2 2 12 May 
1.3 3 23 Peter 
2.3 3 12 Mary 
+0

它看起來像你實際上是使用從該'reshape'功能'stats'包,而不是'reshape'包。 – 2011-04-06 17:17:37

+0

@Richie:是的,但colsplit是在重塑包。 – 2011-04-06 17:26:58

2

這樣做,使用strsplit的基礎方式:

as.data.frame(
    t(
    do.call(cbind, 
     lapply(1:nrow(df),function(x){ 
     sapply(unlist(strsplit(df[x,3],"&")),c,df[x,1:2],USE.NAMES=FALSE) 
     }) 
    ) 
) 
) 

    V1 Time date 
1 Apple 1 23 
2 June 1 23 
3 Peter 1 23 
4 Apple 3 12 
5 May 3 12 
6 Mary 3 12 
+0

+1尊重..... – Andrie 2011-04-06 17:23:06

+0

這就是我會這樣做的。愛你的申請。 :) – 2011-04-07 05:53:07

1

reshape解決方案的變體,使用stringr更方便地拆分名稱字符串。

library(reshape) 
library(stringr) 

wide_df <- cbind(df[, 1:2], str_split_fixed(df[, 3], "&", 3)) 
long_df <- melt(wide_df, id.vars = c("Time", "date")) 
long_df$variable <- NULL 
names(long_df)[3] <- "people" 
long_df 
相關問題