Существуют ли какие-либо команды, подобные colsplit, но разбивающие ячейку на один и тот же столбец, но на другую строку? - PullRequest
2 голосов
/ 06 апреля 2011

У меня есть таблица со следующими строками

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

Я знаю, что reshape + colsplit можно использовать для разделения столбца людей на разные столбцы в одной строке.

Как насчет ряда? Как я могу разделить их на разные строки, но один и тот же столбец?

Ответы [ 4 ]

2 голосов
/ 06 апреля 2011

Базовый способ сделать это, используя 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
1 голос
/ 07 апреля 2011
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
1 голос
/ 06 апреля 2011

Вариант решения 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
0 голосов
/ 06 апреля 2011

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...