r - 在列表上递归应用函数

标签 r lapply data-manipulation

我正在尝试使用 lapply 和包含多个 for 循环的手工函数将向量的值应用于字符向量列表。啊!本质上我拥有的是一个字符向量列表,如下所示(filename_lists3):

$`809`
[1] "rakelib/blueprint.rb"          "projects/daedalus/daedalus.rb"

$`859`
[1] "README"
...

和一个命名的数字向量,如下所示( Degree_list ):

projects/daedalus/daedalus.rb          rakelib/blueprint.rb 
                        1                             5 
                   README                  README.mdown 
                        6                             1 
...

我要做的就是将filename_list3中的字符串与names( Degree_list)中的字符串进行匹配,当它们相同时,替换filename_list3中的字符串filename_list3level_list 中的整数。

这是我的代码:

dput(filename_lists3[1:10])

structure(list(`809` = c("rakelib/blueprint.rb", "projects/daedalus/daedalus.rb"
), `859` = "README", `957` = "spec/debugger/spec_helper.rb", 
`1007` = c("README.mdown", "README"), `1038` = "spec/ruby/core/file/stat/setgid_spec.rb", 
`1099` = c("vm/test/test_embedding.hpp", "vm/embed.c", "vm/api/embed.h"
), `1179` = c("vm/capi/module.cpp", "kernel/common/module19.rb", 
          "kernel/common/module18.rb"), `1235` = c("vm/builtin/thread.hpp", 
                                                   "vm/builtin/thread.cpp", "kernel/common/thread.rb", "kernel/bootstrap/thread.rb"
          ), `1390` = "spec/ruby/core/marshal/dump_spec.rb", `1422` = c("spec/tags/19/ruby/core/module/constants_tags.txt", 
                                                                        "kernel/common/module19.rb", "kernel/common/module18.rb", 
                                                                        "kernel/common/module.rb")), .Names = c("809", "859", "957", 
                                                                                                                "1007", "1038", "1099", "1179", "1235", "1390", "1422"))

dput(degree_list[1:10])

structure(c(1, 5, 6, 1, 2, 2, 2, 5, 7, 2), .Names = c("projects/daedalus/daedalus.rb", 
                                                  "rakelib/blueprint.rb", "README", "README.mdown", "vm/api/embed.h", 
                                                  "vm/embed.c", "vm/test/test_embedding.hpp", "kernel/common/module18.rb", 
                                                  "kernel/common/module19.rb", "vm/capi/module.cpp"))

以及函数和 lapply 调用:

insert_sna_stat <- function(x, input = degree_list){
  for (i in 1:length(x)){
    for (n in 1:length(input))
      if (names(input)[n] == x[i])
        x[i] <- input[n] else 
      x[i] <- x[i]
  }
}

lapply(filename_lists3, insert_sna_stat)

此时仅生成 null。这里出了什么问题?我如何修改它以执行上面描述的操作?

最佳答案

您可以使用rapply:

> rapply(filename_lists3, function(x) ifelse(x %in% names(degree_list), degree_list[x], x), how='replace')
$`809`
[1] 5 1

$`859`
[1] 6

$`957`
[1] "spec/debugger/spec_helper.rb"

$`1007`
[1] 1 6

$`1038`
[1] "spec/ruby/core/file/stat/setgid_spec.rb"

$`1099`
[1] 2 2 2

$`1179`
[1] 2 7 5

$`1235`
[1] "vm/builtin/thread.hpp"      "vm/builtin/thread.cpp"     
[3] "kernel/common/thread.rb"    "kernel/bootstrap/thread.rb"

$`1390`
[1] "spec/ruby/core/marshal/dump_spec.rb"

$`1422`
[1] "spec/tags/19/ruby/core/module/constants_tags.txt"
[2] "7"                                               
[3] "5"                                               
[4] "kernel/common/module.rb"  

关于r - 在列表上递归应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30863820/

相关文章:

r - 在 ggplot2 中组合图例

r - 如何重写这些 for 循环以在 R 中应用

r - 使用 R 使用 lapply 将列添加到多个数据帧

r - 转置 data.frame 并计算每列的非 NA 值

r - 如何重新排列/操作数据?

r - 在嵌套的 tibble R 中重命名数据列时,取消引用无法在 mutate 和 map2 中找到变量

Rivot_longer() 输出中有 NA

将共享数据列中的多个值重新编码/替换为跨数据帧的单个值

awk - 如何删除包含某个字符串的行之后的所有行?

r - ggplot2 的 "parent element"是什么?