【问题标题】:Error using lapply to pass dataframe variable through custom function使用 lapply 通过自定义函数传递数据帧变量时出错
【发布时间】:2020-04-26 19:11:07
【问题描述】:

我有一个用户建议的功能,作为对我之前问题的回答:

word_string <- function(x) {
  inds <- seq_len(nchar(x))
  start = inds[-length(inds)]
  stop = inds[-1]
  substring(x, start, stop)
}

该功能按预期工作,并根据我的规范将给定单词分解为组件:

 word_string('microwave')
[1] "mi" "ic" "cr" "ro" "ow" "wa" "av" "ve"

我现在想要做的是将函数应用于数据框中指定列的所有行。

这是用于说明目的的数据框:

word <- c("House", "Motorcar", "Boat", "Dog", "Tree", "Drink")
some_value <- c("2","100","16","999", "65","1000000")
my_df <- data.frame(word, some_value, stringsAsFactors = FALSE ) 
my_df
      word some_value
1    House          2
2 Motorcar        100
3     Boat         16
4      Dog        999
5     Tree         65
6    Drink    1000000

现在,如果我使用 lapply 在我的数据帧上运行该函数,我不仅会得到不正确的结果,还会出现错误消息。

 lapply(my_df['word'], word_string)
$word
[1] "Ho" "ot" "at" ""   "Tr" "ri"

Warning message:
In seq_len(nchar(x)) : first element used of 'length.out' argument

因此您可以看到该函数正在被应用,但它被应用以部分评估每一行。 所需的输出类似于:

[1] "ho" "ou" "us" "se
[2] "mo" "ot" "to" "or" "rc" "ca" "ar"
[3] "bo" "oa" "at"
[4] "do" "og"
[5] "tr" "re" "ee" 
[6] "dr" "ri" "in" "nk"

非常感谢任何指导。

【问题讨论】:

    标签: r function lapply


    【解决方案1】:

    原因是[ 仍然是一列的data.frame(如果我们不使用,),所以这里的单位是一列。

    str(my_df['word'])
    'data.frame':   6 obs. of  1 variable:
    # $ word: chr  "House" "Motorcar" "Boat" "Dog" ...
    

    lapply 循环遍历该列而不是该列中的每个元素。

    W 需要$[[

    lapply(my_df[['word']], word_string)
    #[[1]]
    #[1] "Ho" "ou" "us" "se"
    
    #[[2]]
    #[1] "Mo" "ot" "to" "or" "rc" "ca" "ar"
    
    #[[3]]
    #[1] "Bo" "oa" "at"
    
    #[[4]]
    #[1] "Do" "og"
    
    #[[5]]
    #[1] "Tr" "re" "ee"
    
    #[[6]]
    #[1] "Dr" "ri" "in" "nk"
    

    【讨论】:

    • 啊,是的!这似乎是一个显而易见的原因。谢谢你,阿克伦。我会接受你的回答。
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 2022-01-21
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多