2016-06-13 4 views
2

Когда rbind с несколькими файлами данных, я хотел бы указать, где были начаты первые данные. Поэтому при использовании:Rbind несколько data.frames с индикаторами строк

df1<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4)) 
df2<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4)) 
dfTotal<-rbind(df1,df2) 

Я бы хотел иметь указатель, где df2 начал работать с dfTotal.


Два вопроса:

  1. Можно ли это сделать?
  2. Есть ли лучший способ получить первый столбец только от 1 до 8?

ответ

2

Как насчет этого с помощью base R функции:

cbind(indicator=c(rep("df1", nrow(df1)), rep("df2", nrow(df2))) ,dfTotal<-rbind(df1,df2)) 

даст вам:

indicator c.1..2..3..4. rnorm.1.4. rnorm.1.4..1 rnorm.1.4..2 
1  df1    1 -0.50219235 0.1169713 -0.82525943 
2  df1    2 0.13153117 0.3186301 -0.35986213 
3  df1    3 -0.07891709 -0.5817907 0.08988614 
4  df1    4 0.88678481 0.7145327 0.09627446 
5  df2    1 -0.20163395 -0.3888542 -0.43808998 
6  df2    2 0.73984050 0.5108563 0.76406062 
7  df2    3 0.12337950 -0.9138142 0.26196129 
8  df2    4 -0.02931671 2.3102968 0.77340460 

DATA

set.seed(100) 
df1<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4)) 
df2<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4)) 
dfTotal<-rbind(df1,df2) 
+1

эталоном является неправильным. Пожалуйста, проверьте хотя бы, если размер результата будет таким, как ожидалось! Всюду вы используете 'mget (ls())' внутри функции, вам нужно получить значения из правильной среды. – Arun

+0

@Arun, спасибо, что указали это. На данный момент я удалил контрольный показатель. Я посмотрю позже. – 989

3

Мы можем использовать rbindlist с idcol аргументом

library(data.table) 
rbindlist(list(df1,df2), idcol='grp') 

Если имеется несколько наборов данных с рисунком «ДФ» с последующим числами, мы можем использовать mget с paste, чтобы получить все наборы данных в `списке

rbindlist(mget(paste0("df", 1:2)), idcol = "grp") 

Или использовать bind_rows от dplyr

library(dplyr) 
bind_rows(df1, df2, .id='grp') 

Или мы можем использовать base R в компактном виде

do.call(rbind, Map(cbind, ind = 1:2, mget(paste0("df", 1:2)))) 
0

Вот уже базовый метод R, который помещает data.frames в список для манипуляций:

# put the data.frames into a list 
dfList <- mget(ls(pattern="df[0-9]+")) 

# append the list of data.frames into a single data.frame 
dfTotal <- do.call(rbind, dfList) 

# get the ID from the row names 
dfTotal$id <- as.integer(gsub("^df(\\d)+.*", "\\1", rownames(dfTotal))) 

Чтобы узнать больше о работе со списками данных. кадров, посмотрите на this post.

+0

В первой строке 'mget' нужна еще одна скобка, я думаю. – 989

+0

@ m0h3n Спасибо, что поймали это. – lmo

1

Простой способ получить указатель строки путем добавления 2 переменной в df1 и df2 ниже

df1<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4),map="d1") 
df2<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4),map="d2") 
dfTotal<-rbind(df1,df2) 

    c.1..2..3..4. rnorm.1.4. rnorm.1.4..1 rnorm.1.4..2 map 
1    1 1.5211423 -0.05746568 0.7507580 d1 
2    2 -0.5016556 0.33257341 -0.7042438 d1 
3    3 -0.7154221 -0.79463908 -1.0391944 d1 
4    4 -0.3255207 0.04130148 -1.4263133 d1 
5    1 -1.5784721 0.58019130 -0.2091264 d2 
6    2 -1.1682966 -0.17827840 1.3235675 d2 
7    3 0.3025030 1.98774090 0.3537830 d2 
8    4 2.5133713 -0.28664053 1.0521226 d2 
+1

Это может быть, если вы являетесь генератором данных. – 989

+0

@ m0h3n ya его правда –