2013-08-06 4 views
-1

У меня есть комбинированная таблица, состоящая из сотен подтабликов, которые разделены *. Эти подтаблицы имеют одинаковую структуру, говорит: col1 - это имя, col2 - вес, col3 - цвет глаз и т. Д. Я хочу удалить *, но добавьте новый столбец в комбинированную таблицу, чтобы указать, откуда находятся подтаблицы из. новый столбец выглядитДобавить новый столбец в комбинированную таблицу, чтобы указать строки, из которых подкатегория

subtable1 
subtable1 
subtable1 
subtable2 
subtable2 
subtable3 
subtable3 
subtable3 
subtable3 

Как я могу это сделать в R?

+1

Под "стол", вы имеете в виду в/файл CSV ввода текста? –

+0

Или вы имеете в виду data.frame, загруженный в R? – Thomas

+0

Я думаю, что он хочет прочитать все эти таблицы в R (некоторый txt-файл, где каждая таблица разделена '*****'), добавьте столбец в каждую таблицу, которая идентифицирует его как таблицу, а затем 'rbind' Все это. –

ответ

0

Здесь Как бы я это сделал. Сначала я генерирую некоторые данные для имитации проблемы.

text='Mazda RX4   21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Datsun 710   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
******* 
Mazda RX4   21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Datsun 710   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
******* 
Mazda RX4   21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Datsun 710   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1' 

## read all lines, in your case you give the fileName here 
ll <- readLines(textConnection(text)) 
## detect the sub table delimiter lines 
id <- grepl('\\*+',ll) 
## removes them from lines and read them using read.table 
dat <- read.table(text=ll[!id]) 
## create the group delimiter using cumsum 
dat$table <- paste0('subtable',cumsum(id)[!id]) 


    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13  table 
1 Mazda RX4 21.0 6 160 110 3.90 2.62 16.46 0 1 4 4 subtable0 
2 Datsun 710 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1 subtable0 
3 Mazda RX4 21.0 6 160 110 3.90 2.62 16.46 0 1 4 4 subtable1 
4 Datsun 710 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1 subtable1 
5 Mazda RX4 21.0 6 160 110 3.90 2.62 16.46 0 1 4 4 subtable2 
6 Datsun 710 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1 subtable2 
0

Предполагая, что вы читаете из файла:

f <- read.table("filename", fill=TRUE, ....) # insert the required arguments here 

# identify separator lines: assume 1st column is '*' and others are all blank 
# tweak specifics to fit 
sep <- f[,1] == "*" & rowSums(!is.na(f[,-1])) == 0 

f$subtable <- cumsum(sep) + 1 
f <- f[!sep, ] 

Идея заключается в том, чтобы прочитать весь файл, а затем определить разделительные линии, как те, не содержащие ничего, кроме *. Поскольку вы не сказали, что такое фактическое содержимое вашего файла, трудно предоставить что-то более конкретное. Вам нужно будет настроить его, чтобы обрабатывать все, что содержится в вашем файле.

0

Основываясь на том, что я понимаю, я проиллюстрирую с использованием данных mtcars из R:

library(plyr) # for rbind.fill 

# divide the data frames into 2 which is equivalent to 2 sub-tables 
data1<-subset(mtcars,am==0) 
data2<-subset(mtcars,am==1) 

# let s be your special sign which is * seperating dataframe 1 and dataframe2 (horizontally) 
data1$s<-rep("*",(dim(data1)[1])) 


data3<-rbind.fill(data1,data2) # append data1 and data2 
tablename<-rep(paste0("subtable",1:2),c(dim(data1)[1],dim(data2)[1])) 
tablename<-as.data.frame(tablename) # generate filename as data frame 

mydata<-cbind(data3,tablename) # merge data3 and tablename 
finaldata<-mydata[,-(dim(mydata)[2]-1)] # remove column with seperator which is s 

> head(finaldata,n=20) 
    mpg cyl disp hp drat wt qsec vs am gear carb tablename 
1 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 subtable1 
2 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 subtable1 
3 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 subtable1 
4 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 subtable1 
5 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 subtable1 
6 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 subtable1 
7 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 subtable1 
8 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 subtable1 
9 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 subtable1 
10 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 subtable1 
11 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 subtable1 
12 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 subtable1 
13 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 subtable1 
14 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 subtable1 
15 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 subtable1 
16 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 subtable1 
17 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 subtable1 
18 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 subtable1 
19 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 subtable1 
20 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 subtable2 

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

  • Нет связанных вопросов^_^