У меня разбросаны базы данных в виде списка. Я хотел бы сгруппировать базы данных одного года;
mydata12<-data.frame(Age=c(12,13),Sex=c("F","H"), Weight=c(70,75),year=c(2012))
mydata13<-data.frame(Age=c(14,15),Sex=c("F","H"), Weight=c(70,75),year=c(2013))
mydata14<-data.frame(Age=c(16,17),Sex=c("F","H"), Weight=c(70,75),year=c(2014))
mydata2012<-data.frame(Age=c(18,19),Sex=c("F","H"), Weight=c(70,75),year=c(2012))
mydata2013<-data.frame(Age=c(20,13),Sex=c("H","H"), Weight=c(70,75),year=c(2013))
mydata2014<-data.frame(Age=c(22,13),Sex=c("F","F"), Weight=c(70,75),year=c(2014))
mydatalist<-list(
`12`=mydata12,
`13`=mydata13,
`14`=mydata14,
`2013`=mydata2012,
`2014`=mydata2013,
`2015`=mydata2014
)
Я могу сделать это с помощью этой функции
list(`2012`=rbind(mydatalist$`12`,mydata2012),
`2013`=rbind(mydatalist$`13`,mydata2013),
`2014`=rbind(mydatalist$`14`,mydata2014))
но хотелось бы покороче (без строчки кода на каждый год), так как у нас уже есть выкройки 2012:2021
,
12:21
Мы могли бы использовать bind_rows
с group_split
:
library(dplyr)
bind_rows(mydatalist) %>%
split(f = as.factor(.$year))
$`2012`
Age Sex Weight year
1 12 F 70 2012
2 13 H 75 2012
7 18 F 70 2012
8 19 H 75 2012
$`2013`
Age Sex Weight year
3 14 F 70 2013
4 15 H 75 2013
9 20 H 70 2013
10 13 H 75 2013
$`2014`
Age Sex Weight year
5 16 F 70 2014
6 17 H 75 2014
11 22 F 70 2014
12 13 F 75 2014
Спасибо, это может быть очень полезно для некоторых из моего списка фреймов данных. Но не все, потому что у меня есть другой список фреймов данных, не содержащий год столбца. Поэтому я могу присоединиться к ним только по имени фрейма данных, а не по имени столбца.
В base R
используйте либо подстроку имен списков, то есть последние 2 цифры, либо добавьте 20
в качестве префикса к тем, у которых в имени списка только 2 символа, затем split
list
и rbind
out <- lapply(split(mydatalist, sub("^(\\d{2})$", "20\\1",
names(mydatalist))), \(x) `row.names<-`(do.call(rbind, x), NULL))
-выход
> out
$`2012`
Age Sex Weight year
1 12 F 70 2012
2 13 H 75 2012
3 18 F 70 2012
4 19 H 75 2012
$`2013`
Age Sex Weight year
1 14 F 70 2013
2 15 H 75 2013
3 20 H 70 2013
4 13 H 75 2013
$`2014`
Age Sex Weight year
1 16 F 70 2014
2 17 H 75 2014
3 22 F 70 2014
4 13 F 75 2014
Я не уверен, насколько "коротким" вы довольны, но ниже может быть вариант
> split(`row.names<-`(do.call(rbind, mydatalist), NULL), ~year)
$`2012`
Age Sex Weight year
1 12 F 70 2012
2 13 H 75 2012
7 18 F 70 2012
8 19 H 75 2012
$`2013`
Age Sex Weight year
3 14 F 70 2013
4 15 H 75 2013
9 20 H 70 2013
10 13 H 75 2013
$`2014`
Age Sex Weight year
5 16 F 70 2014
6 17 H 75 2014
11 22 F 70 2014
12 13 F 75 2014
В созданном
mydatalist
нет ли опечаток, т.е. вы показали2013 = mydata2012
, должно быть2012 = mydata2012
и за 2013 и 2014 год тоже?