mutate () список, основанный на другом списке - PullRequest
0 голосов
/ 31 января 2019

В этом примере у меня есть два списка

tiers <- list("tier 1", "tier 2", "tier 3")

main <- list(data.frame(a = c("this", "that")), 
             data.frame(a = c("the other", "that too")), 
             data.frame(a = c("once more", "kilgore trout")))

, и я бы хотел mutate() каждый элемент списка (то есть data.frame()) в main, добавив значение в tiers из соответствующего элемента.Я думал, что mapply() сделает это:

library(dplyr)

mapply(function(x, y) y %>% mutate(tier = x), tiers, main)

, но я получаю неожиданный результат

> mapply(function(x, y) y %>% mutate(tier = x), tiers, main)
     [,1]        [,2]        [,3]       
a    factor,2    factor,2    factor,2   
tier Character,2 Character,2 Character

, тогда как я ожидал, что

[[1]]
     a   tier
1 this tier 1
2 that tier 1

[[2]]
          a   tier
1 the other tier 2
2  that too tier 2

[[3]]
              a   tier
1     once more tier 3
2 kilgore trout tier 3

Использую ли яmapply() правильно?Если нет, то что я должен использовать, чтобы получить ожидаемый результат?Следует отметить, что фактические данные могут содержать до n элементов списка;Я не могу жестко закодировать любые значения в терминах 1:n.

Ответы [ 4 ]

0 голосов
/ 31 января 2019

В базе R вы можете использовать Map с функцией data.frame, если назовете аргумент tier:

Map(data.frame, main, tier=tiers)
# [[1]]
#      a   tier
# 1 this tier 1
# 2 that tier 1
# 
# [[2]]
#           a   tier
# 1 the other tier 2
# 2  that too tier 2
# 
# [[3]]
#               a   tier
# 1     once more tier 3
# 2 kilgore trout tier 3
0 голосов
/ 31 января 2019

Кроме того, рассмотрим within или transform с Map (упаковщик версии списка до mapply) и избегайте загрузки пакета для одной функции, mutate:

Map(function(x, y) within(y, tier <- x), tiers, main)

Map(function(x, y) transform(y, tier = x), tiers, main)
0 голосов
/ 31 января 2019

Мы можем сделать это в tidyverse с map2

library(tidyverse)
map2(main, tiers, ~ .x %>%
           mutate(tiers = .y))
#[[1]]
#     a  tiers
#1 this tier 1
#2 that tier 1

#[[2]]
#          a  tiers
#1 the other tier 2
#2  that too tier 2

#[[3]]
#              a  tiers
#1     once more tier 3
#2 kilgore trout tier 3
0 голосов
/ 31 января 2019

Вам нужно было добавить SIMPLIFY = FALSE в ваш mapply вызов

library(dplyr)
mapply(function(x, y) y %>% mutate(tier = x), tiers, main, SIMPLIFY = FALSE)


#     a   tier
#1 this tier 1
#2 that tier 1

#[[2]]
#          a   tier
#1 the other tier 2
#2  that too tier 2

#[[3]]
#              a   tier
#1     once more tier 3
#2 kilgore trout tier 3

?mapply говорит

SIMPLIFY - попытка свести результат к вектору, матрица или массив более высокого размера;

SIMPLIFY аргумент по умолчанию TRUE в mapply и FALSE в Map

Map(function(x, y) y %>% mutate(tier = x), tiers, main)

Если вы хотите сохранить все в базе R, вы можете использовать cbind

Map(cbind, main, tiers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...