Передача различных аргументов в функцию для каждого фрейма данных в списке - PullRequest
0 голосов
/ 17 января 2020

Вот упрощенный пример моих данных:

У меня есть список фреймов данных

set.seed(1)
data1 <- data.frame(A = sample(1:10))
data2 <- data.frame(A = sample(1:10))
data3 <- data.frame(A = sample(1:10))
data4 <- data.frame(A = sample(1:10))
list1 <- list(data1, data2, data3, data4)

И фрейм данных, содержащий то же количество значений, что и фреймы данных в list1

data5 <- data.frame(B = c(10, 20, 30, 40))

Я хотел бы создать новый столбец C в каждом из фреймов данных в list1, где:

C = A * (B/nrow(A))

со значением для B, полученным из data5, так что B = 10 для первого кадра данных в list1 (то есть data1) и B = 20 для второго кадра данных data2 и т. д.

Из того, что я прочитал, mapply, вероятно, является решением, но я изо всех сил пытаюсь определить, как задать одно значение B для всех строк в каждом из фреймов данных в list1.

Любые предложения будут чрезвычайно оценили.

1 Ответ

1 голос
/ 17 января 2020

Вам нужно использовать от Map до l oop для разных векторов или списка параллельно:

Map(function(df, B) transform(df, C = A*(B/nrow(df))),list1,data5$B)
#> [[1]]
#>     A  C
#> 1   8  8
#> 2  10 10
#> 3   1  1
#> 4   6  6
#> 5   7  7
#> 6   9  9
#> 7   3  3
#> 8   4  4
#> 9   2  2
#> 10  5  5
#> 
#> [[2]]
#>     A  C
#> 1  10 20
#> 2   3  6
#> 3   2  4
#> 4   1  2
#> 5   9 18
#> 6   4  8
#> 7   6 12
#> 8   5 10
#> 9   8 16
#> 10  7 14
#> 
#> [[3]]
#>     A  C
#> 1   5 15
#> 2   7 21
#> 3   1  3
#> 4   4 12
#> 5   2  6
#> 6   6 18
#> 7  10 30
#> 8   3  9
#> 9   8 24
#> 10  9 27
#> 
#> [[4]]
#>     A  C
#> 1   3 12
#> 2   9 36
#> 3   6 24
#> 4   4 16
#> 5   2  8
#> 6   1  4
#> 7  10 40
#> 8   5 20
#> 9   7 28
#> 10  8 32

Вы можете быть немного более компактным, используя tidyverse :

library(tidyverse)
map2(list1, data5$B, ~mutate(.x, C = A*(.y/nrow(.x))))
...