Выборочное изменение одного элемента списка в столбце списка (аккуратное решение) - PullRequest
0 голосов
/ 20 января 2019

Я хочу заменить один элемент списка в столбце списка значением из другого столбца:

library(tidyverse)
df <- tibble(a = list(list(number = 1, letter = "a"), list(number = 2, letter = "b")), b = c("c", "d"))
print(df)
#> # A tibble: 2 x 2
#>   a          b    
#>   <list>     <chr>
#> 1 <list [2]> c    
#> 2 <list [2]> d

Вот как должен выглядеть вывод:

df2 <- tibble(a = list(list(number = 1, letter = "c"), list(number = 2, letter = "d")), b = c("c", "d"))
print(df2)
#> # A tibble: 2 x 2
#>   a          b    
#>   <list>     <chr>
#> 1 <list [2]> c    
#> 2 <list [2]> d

Мне удалось использовать цикл for и запутанный синтаксис поднабора, но мне интересно, есть ли аккуратная функция или более элегантный способ для достижения моей цели:

for (i in 1:nrow(df)) {
  df$a[[i]]$letter <- df$b[[i]]
}

1 Ответ

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

Мы могли бы использовать базовый подход R, используя mapply, изменяя значения в элементе letter каждого списка из соответствующего элемента b.

df$a <- mapply(function(x, y) {x['letter'] <- y;list(x)}, df$a, df$b)

df$a
#[[1]]
#[[1]]$number
#[1] 1

#[[1]]$letter
#[1] "c"


#[[2]]
#[[2]]$number
#[1] 2

#[[2]]$letter
#[1] "d"

Если вас интересует подход tidyverse, мы можем использовать ту же логику, используя map2

library(tidyverse)

df$a <- map2(df$a, df$b, function(x, y) {x['letter'] <- y;x})

Или используя другой подход, используяlapply

do.call("rbind", lapply(seq_len(nrow(df)), function(x) {
        df$a[[x]]['letter'] <- df$b[x]
        df[x, ]
}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...