根据您的描述,我假设您的数据如下所示:
country_year <- c("Australia_2013", "Australia_2014", "Bangladesh_2013")
health <- matrix(nrow = 3, ncol = 3, data = runif(9))
dataset <- data.frame(rbind(country_year, health), row.names = NULL, stringsAsFactors = FALSE)
dataset
# X1 X2 X3
#1 Australia_2013 Australia_2014 Bangladesh_2013
#2 0.665947273839265 0.677187719382346 0.716064820764586
#3 0.499680359382182 0.514755881391466 0.178317369660363
#4 0.730102791683748 0.666969108628109 0.0719663293566555
首先,move your row 1 (e.g., Australia_2013, Australia_2014 etc.) to the column names,然后应用循环创建基于国家/地区的数据框。
library(dplyr)
# move header
dataset2 <- dataset %>%
`colnames<-`(dataset[1,]) %>% # uses row 1 as column names
slice(-1) %>% # removes row 1 from data
mutate_all(type.convert) # converts data to appropriate type
# apply loop
for(country in unique(gsub("_\\d+", "", colnames(dataset2)))) {
assign(country, select(dataset2, starts_with(country))) # makes subsets
}
关于循环,
gsub("_\\d+", "", colnames(dataset2)) 通过将“_[year]”替换为空(即删除它)来提取国家/地区名称,并且应用的 unique() 函数提取每个国家/地区名称之一。
assign(country, select(dataset2, starts_with(country))) 创建一个以国家/地区命名的变量,该国家/地区变量仅包含 dataset2 中以国家/地区名称开头的列。
编辑:回复评论
评论中的问题是询问如何在基于国家/地区的数据框中添加逐行摘要(例如,rowSums()、rowMeans())作为新列,同时使用此 for 循环。
这是一种需要最少更改的解决方案:
for(country in unique(gsub("_\\d+", "", colnames(dataset2)))) {
assign(country,
select(dataset2, starts_with(country)) %>% # makes subsets
mutate( # creates new columns
rowSums = rowSums(select(., starts_with(country))),
rowMeans = rowMeans(select(., starts_with(country)))
)
)
}
mutate() 向数据集添加新列。
select(., starts_with(country)) 从当前对象中选择以国家名称开头的列(在函数中表示为.)。