有选择地修改列表列中列表的单个元素(整洁的解决方案)

时间:2019-01-20 03:51:37

标签: r tidyverse

我想用另一列中的值替换列表列中列表的单个元素:

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 (i in 1:nrow(df)) {
  df$a[[i]]$letter <- df$b[[i]]
}

我能够使用for循环和令人困惑的子集语法,但是我想知道是否有一个整齐的函数或更优雅的方法来实现我的目标:

<img src="save.png"(click)="validateandsave(model)">
<input type="text" name="code" [(ngModel)]="model.code">
<input type="text" name="name" [(ngModel)]="model.name">
<a routerLink="PC">
<div (click)="showsettings()"> </div>
<router-outlet><router-outlet>

1 个答案:

答案 0 :(得分:1)

我们可以通过从相应的mapply元素中更改每个列表的letter元素中的值来使用使用b的基本R方法。

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, ]
}))