【问题标题】:Using lapply to perform custom-defined function of element comparisons使用 lapply 执行自定义的元素比较功能
【发布时间】:2018-03-04 19:01:28
【问题描述】:

我正在尝试寻找一种更 R 的方式来应用我的函数,该函数将两个字符串一起与命名列表中的命名列表元素进行比较。寻找一种没有 for 循环的方法,所以我看了一下lapply;任何建议,我将不胜感激!

这是一个可重现的例子:

my_list <- list(coca = c(13, 422, 131, 2), cola = c(11, 53, 3))
names(my_list$coca) <- c("sprite", "coke", "pepsi", "cocacoca")
names(my_list$cola) <- c("lemonade", "juice", "colacola")

compare_substr <- function(word1, word2, min_char){

 # INPUT: word1, word2, and min_char (optional)
 # OUTPUT: TRUE or FALSE

 if(class(word1) != "character" || class(word2) != "character"){
   stop("Error: Words being compared are not in character format")
 }
 if(missing(min_char)){
   min_char <- nchar(word1)
 }
 if(substring(word1, 1, min_char) == substring(word2, 1, min_char)){
   return(TRUE)
 }
 else{
   return(FALSE)
 }
}

最终结果应该是这样的,所以我可以过滤出TRUE

$coca
sprite     coke    pepsi cocacoca 
FALSE    FALSE    FALSE     TRUE 

$cola
lemonade    juice colacola 
FALSE    FALSE     TRUE 

我目前的方法是通过 for 循环,但我知道使用 lapply 有一种更简洁的方法,但我开始认为我的 compare_substr 函数必须更改才能这样做。 ..有没有办法在不改变功能的情况下做到这一点?

【问题讨论】:

  • 预期输出是什么?请添加。
  • @ManishSaraswat 感谢您的建议。我已经添加了预期的输出!

标签: r list apply lapply


【解决方案1】:

方法一:这是使用sapply函数:

说明:

1 - 对于my_list 中的每个名称,grepl 函数检查该名称是否存在于子列表名称中。 grepl 返回一个布尔值。
2 - 我们将上一步的输出保存在新的plist 中。
3 - 最后,我们设置名称。

# create a new list
library(stringr)
plist <- list()

# match names and update the new list
plist <- sapply(names(my_list), function(x) {

    plist[[x]] <- grepl(x, names(my_list[[x]]))


}) 

# set names
names(plist$coca) <- c("sprite", "coke", "pepsi", "cocacoca")
names(plist$cola) <- c("lemonade", "juice", "colacola")

# output
    $coca
  sprite     coke    pepsi cocacoca 
   FALSE    FALSE    FALSE     TRUE 

$cola
lemonade    juice colacola 
   FALSE    FALSE     TRUE 

方法 2:另外,您可以使用 for 循环执行此操作(很高兴知道):

library(stringr)
new_list <- list()
for(i in names(my_list))
{

    # get name of the sublist
    temp <- names(my_list[[i]])

    # check if the name of parent list is present (this returns boolean)
    sol <- str_detect(temp, i)

    # update new list
    new_list[[i]] <- sol
    names(new_list[[i]]) <- temp

}

print(new_list)

$coca
  sprite     coke    pepsi cocacoca 
   FALSE    FALSE    FALSE     TRUE 

$cola
lemonade    juice colacola 
   FALSE    FALSE     TRUE 

【讨论】:

  • 感谢您的解决方案。有什么办法可以通过其中一个申请家庭来做到这一点?
  • 是的,可以使用 lapply。我也加一下。
  • 我已经添加了应用解决方案。请检查。
  • 这很完美!您能否简要解释一下 sapply 发生了什么以及它是如何与 grepl 一起使用来进行比较的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 2022-07-31
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多