2014-05-30 4 views
-1

У меня есть данные в этом формате (2 колонки):Сплит один столбец на несколько строк в R

данные .......... индекс
city1 ....... ..... 1
person1 ....... 2
telephone1 ... 3
City2 .............. 1
city3 ..... ......... 1
телефон3 .... 3

Я добавил вторую колонку, чтобы знать какие данные представляют каждая строка (1-го, 2-х человек, 3-телефон).

Что мне нужно это (1,2,3 стать имена столбцов):

1 ................ 2 ..... ............. 3
город1 ....... человек1 ... телефон1
город2 ........ NULL ........ ..NULL
город3 ........ NULL ........ телефон3

Как это сделать в R?

ответ

1

Вот одно из возможных решений

#sample data 
dd<-data.frame(
    data= c("city1","person1","telephone1","city2","city3","telephone3"), 
    index=c(1,2,3,1,1,3), 
    stringsAsFactors=F 
) 

#assign new row when index stays the same or decreases 
row<-cumsum(c(1,diff(dd$index))<1)+1 

#create empty matrix to hold result 
mm<-matrix(character(), nrow=max(row), ncol=max(dd$index)) 

#put values where they belong 
mm[cbind(row, dd$index)]<-dd$data 

И это возвращает

#  [,1] [,2]  [,3]   
# [1,] "city1" "person1" "telephone1" 
# [2,] "city2" NA  NA   
# [3,] "city3" NA  "telephone3" 
+0

Спасибо, работает отлично! – user3692919

0

Используя числа встроенных в data столбце, что и индекс строки, с данными MrFlick в:

dd<-data.frame(
    data= c("city1","person1","telephone1","city2","city3","telephone3"), 
    index=c(1,2,3,1,1,3), 
    stringsAsFactors=F 
) 

r <- as.numeric(gsub("\\D*", "", dd$data)) 
m <- matrix(,nrow=max(r), ncol=max(dd$index)) 
m[cbind(r, dd$index)] <- dd$data 
m 

    [,1] [,2]  [,3]   
[1,] "city1" "person1" "telephone1" 
[2,] "city2" NA  NA   
[3,] "city3" NA  "telephone3" 
+0

Спасибо за ваш ответ, работает как шарм! – user3692919

0

Вот другая возможность: создать переменную «время» и использовать reshape o r dcast от "reshape2".

Используя данные образца @ MrFlick, введите переменную «время». Тем не менее, это предполагает, что данные уже находятся в правильном порядке:

dd$time <- cumsum(dd$index == 1) ## Similar to MrFlick's approach... 

Вот reshape подход:

reshape(dd, direction = "wide", idvar="time", timevar="index") 
# time data.1 data.2  data.3 
# 1 1 city1 person1 telephone1 
# 4 2 city2 <NA>  <NA> 
# 5 3 city3 <NA> telephone3 

И вот dcast подход:

library(reshape2) 
dcast(dd, time ~ index, value.var="data") 
# time  1  2   3 
# 1 1 city1 person1 telephone1 
# 2 2 city2 <NA>  <NA> 
# 3 3 city3 <NA> telephone3 

(Только FYI, ответ г-на Флика, скорее всего, будет самым быстрым из-за использования матрицы ind exing. reshape достаточно эффективен с меньшими наборами данных, но быстро замедляется. Если скорость связана с dcast, то вместо этого выйдите dcast.data.table.)

+0

Спасибо, что указали это. Я сначала попробовал с изменением формы, я просто пропустил переменную времени. – user3692919

Смежные вопросы