Как выполнить выборочную rbind для наборов данных в R

Я пытаюсь использовать rbind для добавления разных наборов данных по странам. Список наборов данных

data <- c('a1','a2','a3','b1','b2','bu3','bu4','c1','c3')
code <- c('a','b','bu',c)

Структура данных примерно такая:

countrya1 <- c("a","a","a")
yeara1 <- c("1","1","1")
inca1 <- c("1","2","3")
a1 <- data.frame(countrya1,yeara1,inca1)
countrya2 <- c("a","a","a")
yeara2 <- c("2","2","2")
inca2 <- c("1","4","3")
a2 <- data.frame(countrya2,yeara2,inca2)
countryb1 <- c("b","b","b")
yearb1 <- c("1","1","1")
incb1 <- c("1","2","7")
b1 <- data.frame(countryb1,yearb1,incb1)
countryb2 <- c("b","b","b")
yearb2 <- c("2","2","2")
incb2 <- c("6","2","3")
b2 <- data.frame(countryb2,yearb2,incb2)

Код, который я использовал для объединения всех наборов данных, выглядит следующим образом:

df=NULL
for (i in length(data)){
df1 <-read.dta(data[i])
df <-rbind(df,df1)
} 

Это связывает все наборы данных вместе в df. Есть ли способ связать a1,a2,a3 вместе и b1,b2,b3 вместе и так далее. Короче говоря, я хочу связать наборы данных по «коду». Есть ли способ сделать это в R? Заранее спасибо за помощь.


person Bhavya    schedule 02.04.2017    source источник
comment
В вашем цикле for должно быть for(i in seq_along(data))   -  person akrun    schedule 02.04.2017
comment
В вашем примере read.dta выдает мне ошибки. Пожалуйста, приведите пример, который работает   -  person akrun    schedule 03.04.2017


Ответы (1)


Мы можем split получить «данные», создав группу без чисел, а затем с помощью read.dta прочитать наборы данных и rbind наборы данных с тем же именем.

lst <- lapply(split(data, sub("\\d+", "", data)), 
             function(x) do.call(rbind, lapply(x, read.dta)))

Если мы хотим использовать «код», тогда используйте grep, перебирая «код»

lapply(code, function(x) do.call(rbind, lapply(grep(x, data, value = TRUE), read.dta)))

данные

code <- c('a','b','bu','c')
person akrun    schedule 02.04.2017
comment
Это работает отлично! Большое спасибо. Кроме того, есть ли способ сделать это с помощью циклов (для цикла?)? - person Bhavya; 02.04.2017
comment
@Bhavya Вы можете сделать for(i in seq_along(code)){ i1 <- grep(code[i], data, value = TRUE); lst <- vector("list", length(code)); for(j in seq_along(i1)){ lst[[i]][j] <- read.dta(i1[j]); } lst1 <- lapply(lst, function(x) do.call(rbind, x)); } lst1 (не проверено) - person akrun; 02.04.2017
comment
Я понимаю, что ты пытаешься здесь сделать. Но вот что я получаю: Ошибка в do.call(rbind, x): второй аргумент должен быть списком - person Bhavya; 02.04.2017
comment
Кроме того, я очень новичок в R и программировании в целом. Извините, если это кажется слишком очевидным. - person Bhavya; 02.04.2017
comment
@Bhavya Вы должны были предоставить некоторые примеры данных в своем посте, чтобы другие могли их протестировать. - person akrun; 02.04.2017
comment
@Bhavya Можете ли вы изменить его на lst[[i]][[j]] <- read.dta(i1[j]) - person akrun; 02.04.2017
comment
Он по-прежнему показывает ту же ошибку. Я не уверен, почему это не работает. Я добавлю образцы данных здесь. У меня самого нет наборов данных. Необходимо отправить код на онлайн-сервер. - person Bhavya; 02.04.2017
comment
@Bhavya Как я уже упоминал, я не проверял это без примера. - person akrun; 02.04.2017
comment
Я отредактировал вопрос, включив в него некоторые наборы данных (не формат dta). - person Bhavya; 02.04.2017