У меня есть список с несколькими кадрами данных, каждый фрейм данных соответствует выборам, скажем, 2010, 2013,..., 2021.
Для каждого кадра данных я хочу добавить год к имени каждого столбца, кроме первых трех столбцов. Итак, я пытаюсь добавить год к [,4:end_column] с помощью цикла for:
for (i in names(SECCIONES_year)) {
year <- (substr(i, nchar(i)-4, nchar(i)))
end_column <- ncol(SECCIONES_year[[i]])
past_names <- names(SECCIONES_year[[i]][ ,4:end_column])
colnames(SECCIONES_year[[i]][,4:end_column]) <- paste(past_names, year, sep = "")
}
К сожалению, это не работает, но работает, если я работаю со всеми именами столбцов как:
colnames(SECCIONES_year[[i]]) <- paste(past_names, year, sep=)
Я пробовал с именами столбцов, именами и setNames, но каждую попытку терпел неудачу.
С base R
вариант состоит в том, чтобы перебрать list
, а также names
list
с Map
, извлечь substr
ing из имен (можно сделать вне цикла, так как substr
векторизовано), затем назначить подмножество имена столбцов элементов data.frame
, paste
введя substr
«год» с соответствующими именами столбцов, и верните data.frame
SECCIONES_year <- Map(function(x, nm)
{
year <- substr(nm, nchar(nm)-4, nchar(nm))
names(x)[4:ncol(x)] <- paste0(names(x)[4:ncol(x)], year)
x
},
SECCIONES_year, names(SECCIONES_year))
В коде ОП это может быть ошибка присваивания, т.е. вместо colnames(SECCIONES_year[[i]][,4:end_column])
будет colnames(SECCIONES_year[[i]])[,4:end_column]
, т.е. в качестве примера
lst1 <- list(data.frame(col1 = 1:5, col2 = 6:10),
data.frame(col3 = 3:5, col4 = 4:6))
names(lst1) <- c("a", "b")
Проверка вывода обоими методами
# OP's method
> for(nm in names(lst1)) colnames(lst1[[nm]][2]) <- "hello"
> lst1
$a
col1 col2
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
$b
col3 col4
1 3 4
2 4 5
3 5 6
# modified
> for(nm in names(lst1)) colnames(lst1[[nm]])[2] <- "hello"
> lst1
$a
col1 hello
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
$b
col3 hello
1 3 4
2 4 5
3 5 6
Запятая во второй скобке перед "4" не нужна:
colnames(SECCIONES_year[[i]])[4:ncol(SECCIONES_year[[i]])] <- paste(past_names, year, sep = "")