R 在列表上递归应用函数
我试图使用lappy和一个包含多个for循环的手工函数在字符向量列表上应用向量值。啊!基本上,我有一个字符向量列表,看起来像这样(R 在列表上递归应用函数,r,lapply,data-manipulation,R,Lapply,Data Manipulation,我试图使用lappy和一个包含多个for循环的手工函数在字符向量列表上应用向量值。啊!基本上,我有一个字符向量列表,看起来像这样(filename\u lists3): 和一个命名的数字向量,看起来像这样(degree\u list): 我要做的是将文件名列表3中的字符串与名称(度列表)中的字符串匹配,当它们相同时,将文件名列表3中的字符串替换为度列表中的整数 这是我的密码: dput(文件名\u列表3[1:10]) dput(学位列表[1:10]) 以及函数和lappy调用: insert_s
filename\u lists3
):
和一个命名的数字向量,看起来像这样(degree\u list
):
我要做的是将文件名列表3
中的字符串与名称(度列表)
中的字符串匹配,当它们相同时,将文件名列表3
中的字符串替换为度列表中的整数
这是我的密码:
dput(文件名\u列表3[1:10])
dput(学位列表[1:10])
以及函数和lappy调用:
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)
insert\u sna\u stat您可以使用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"
您可以在文件名列表上使用lappy
,并使用这些值来子集度列表。如果没有匹配项,您将得到NA,因此在这种情况下,请环绕并ifelse
返回原始值
lapply(filename_lists3, function(x) ifelse(is.na(degree_list[x]),x,degree_list[x]))
$`809`
rakelib/blueprint.rb projects/daedalus/daedalus.rb
5 1
$`859`
README
6
$`957`
<NA>
"spec/debugger/spec_helper.rb"
$`1007`
README.mdown README
1 6
$`1038`
<NA>
"spec/ruby/core/file/stat/setgid_spec.rb"
$`1099`
vm/test/test_embedding.hpp vm/embed.c
2 2
vm/api/embed.h
2
$`1179`
vm/capi/module.cpp kernel/common/module19.rb kernel/common/module18.rb
2 7 5
$`1235`
<NA> <NA>
"vm/builtin/thread.hpp" "vm/builtin/thread.cpp"
<NA> <NA>
"kernel/common/thread.rb" "kernel/bootstrap/thread.rb"
$`1390`
<NA>
"spec/ruby/core/marshal/dump_spec.rb"
$`1422`
<NA>
"spec/tags/19/ruby/core/module/constants_tags.txt"
kernel/common/module19.rb
"7"
kernel/common/module18.rb
"5"
<NA>
"kernel/common/module.rb"
lapply(文件名\u列表3,函数(x)ifelse(is.na(度列表[x]),x,度列表[x]))
$`809`
rakelib/blueprint.rb项目/daedalus/daedalus.rb
5 1
$`859`
自述
6.
$`957`
“spec/debugger/spec_helper.rb”
$`1007`
README.mdown自述文件
1 6
$`1038`
“spec/ruby/core/file/stat/setgid_spec.rb”
$`1099`
vm/test/test_embedded.hpp vm/embed.c
2 2
vm/api/embed.h
2.
$`1179`
vm/capi/module.cpp kernel/common/module19.rb kernel/common/module18.rb
2 7 5
$`1235`
“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`
“spec/tags/19/ruby/core/module/constants\u tags.txt”
kernel/common/module19.rb
"7"
kernel/common/module18.rb
"5"
“kernel/common/module.rb”
您可以使用以下功能:
res <- lapply(filename_lists3, function(x){
m <- match(x,names(degree_list))
x[!is.na(m)] <- degree_list[m[!is.na(m)]]
return(x)
})
##### results
> res
$`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" "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" "7"
[3] "5" "kernel/common/module.rb"
res我想你最好在这里使用merge
。但是,首先应该将列表转换为data.frames
D1 <- do.call(rbind,lapply(seq_along(filename_lists),
function(i) data.frame(name=filename_lists[[i]],
id = names(filename_lists)[i])))
D2 <- as.data.frame(degree_list)
D2$name <- rownames(D2)
merge(D1,D2,all.x=TRUE)
# name id degree_list
# 1 projects/daedalus/daedalus.rb 809 1
# 2 rakelib/blueprint.rb 809 5
# 3 README 859 6
# 4 README 1007 6
# 5 spec/debugger/spec_helper.rb 957 NA
# 6 README.mdown 1007 1
# 7 spec/ruby/core/file/stat/setgid_spec.rb 1038 NA
# 8 vm/api/embed.h 1099 2
# 9 vm/embed.c 1099 2
# 10 vm/test/test_embedding.hpp 1099 2
# 11 kernel/common/module18.rb 1179 5
# 12 kernel/common/module18.rb 1422 5
# 13 kernel/common/module19.rb 1179 7
# 14 kernel/common/module19.rb 1422 7
# 15 vm/capi/module.cpp 1179 2
# 16 kernel/bootstrap/thread.rb 1235 NA
# 17 kernel/common/thread.rb 1235 NA
# 18 vm/builtin/thread.cpp 1235 NA
# 19 vm/builtin/thread.hpp 1235 NA
# 20 spec/ruby/core/marshal/dump_spec.rb 1390 NA
# 21 kernel/common/module.rb 1422 NA
# 22 spec/tags/19/ruby/core/module/constants_tags.txt 1422 NA
D1
> 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"
lapply(filename_lists3, function(x) ifelse(is.na(degree_list[x]),x,degree_list[x]))
$`809`
rakelib/blueprint.rb projects/daedalus/daedalus.rb
5 1
$`859`
README
6
$`957`
<NA>
"spec/debugger/spec_helper.rb"
$`1007`
README.mdown README
1 6
$`1038`
<NA>
"spec/ruby/core/file/stat/setgid_spec.rb"
$`1099`
vm/test/test_embedding.hpp vm/embed.c
2 2
vm/api/embed.h
2
$`1179`
vm/capi/module.cpp kernel/common/module19.rb kernel/common/module18.rb
2 7 5
$`1235`
<NA> <NA>
"vm/builtin/thread.hpp" "vm/builtin/thread.cpp"
<NA> <NA>
"kernel/common/thread.rb" "kernel/bootstrap/thread.rb"
$`1390`
<NA>
"spec/ruby/core/marshal/dump_spec.rb"
$`1422`
<NA>
"spec/tags/19/ruby/core/module/constants_tags.txt"
kernel/common/module19.rb
"7"
kernel/common/module18.rb
"5"
<NA>
"kernel/common/module.rb"
res <- lapply(filename_lists3, function(x){
m <- match(x,names(degree_list))
x[!is.na(m)] <- degree_list[m[!is.na(m)]]
return(x)
})
##### results
> res
$`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" "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" "7"
[3] "5" "kernel/common/module.rb"
D1 <- do.call(rbind,lapply(seq_along(filename_lists),
function(i) data.frame(name=filename_lists[[i]],
id = names(filename_lists)[i])))
D2 <- as.data.frame(degree_list)
D2$name <- rownames(D2)
merge(D1,D2,all.x=TRUE)
# name id degree_list
# 1 projects/daedalus/daedalus.rb 809 1
# 2 rakelib/blueprint.rb 809 5
# 3 README 859 6
# 4 README 1007 6
# 5 spec/debugger/spec_helper.rb 957 NA
# 6 README.mdown 1007 1
# 7 spec/ruby/core/file/stat/setgid_spec.rb 1038 NA
# 8 vm/api/embed.h 1099 2
# 9 vm/embed.c 1099 2
# 10 vm/test/test_embedding.hpp 1099 2
# 11 kernel/common/module18.rb 1179 5
# 12 kernel/common/module18.rb 1422 5
# 13 kernel/common/module19.rb 1179 7
# 14 kernel/common/module19.rb 1422 7
# 15 vm/capi/module.cpp 1179 2
# 16 kernel/bootstrap/thread.rb 1235 NA
# 17 kernel/common/thread.rb 1235 NA
# 18 vm/builtin/thread.cpp 1235 NA
# 19 vm/builtin/thread.hpp 1235 NA
# 20 spec/ruby/core/marshal/dump_spec.rb 1390 NA
# 21 kernel/common/module.rb 1422 NA
# 22 spec/tags/19/ruby/core/module/constants_tags.txt 1422 NA