Здесь можно использовать Map
, который предназначен для применения функции "к первым элементам каждого ...
аргумента, вторым элементам, третьим элементам", подробности см. ?mapply
.
library(stringr)
vec <- c(2,3,4) # this is the vector of 'widths', don't name it seq
Map(function(i, y) {
dfl[[i]][, 1] <- str_pad(dfl[[i]][, 1], width = y, pad = "0")
dfl[[i]] # this gets returned
},
# you iterate over these two vectors in parallel
i = 1:length(dfl),
y = vec)
Вывод
#[[1]]
# x y
#1 01 9.373546
#2 02 10.183643
#3 03 9.164371
#
#[[2]]
# v y
#1 001 11.595281
#2 002 10.329508
#3 003 9.179532
#4 004 10.487429
#
#[[3]]
# z y
#1 0001 10.738325
#2 0002 10.575781
#3 0003 9.694612
#4 0004 11.511781
#5 0005 10.389843
объяснение
Функция, которую мы передаем Map
, является анонимной функцией, которую вы более или менее предоставили в своемвопрос:
function(i, y) {
dfl[[i]][, 1] <- str_pad(dfl[[i]][, 1], width = y, pad = "0")
dfl[[i]] # this gets returned
}
Вы видите, что функция принимает два аргумента, i
и y
(выберите другие имена, если вам нравится, например, df
и width
), и для каждого кадра данных в вашемсписок изменяет первый столбец dfl[[i]][, 1] <- ...
.Анонимная функция применяет str_pad
к первому столбцу каждого фрейма данных
... <- str_pad(dfl[[i]][, 1], width = y, pad = "0")
, но вы видите, что мы не передаем фиксированное значение аргументу width
, а y
,
Возвращаясь к Map
.Map
теперь применяется str_pad
к первому фрейму данных, с аргументом width = 2
, применяется str_pad
ко второму фрейму данных, с аргументом width = 3
и - вы, наверное, догадались - он применяет str_pad
к третьему фрейму данныхв вашем списке с аргументом width = 4
.
Аргументы указаны в последних двух строках кода как
i = 1:length(dfl),
y = vec)
Надеюсь, это поможет.
data
(рассмотрим создание примера minimal в следующий раз, так как количество строк в кадрах данных не имеет значения дляпроблема)
set.seed(1)
df1 <- data.frame("x" = as.character(1:3), "y" = rnorm(3, 10, 1),
stringsAsFactors = FALSE)
df2 <- data.frame("v" = as.character(1:4), "y" = rnorm(4, 10, 1),
stringsAsFactors = FALSE)
df3 <- data.frame("z" = as.character(1:5), "y" = rnorm(5, 10, 1),
stringsAsFactors = FALSE)
#Combine data fames into list
dfl <- list(df1, df2, df3)