【问题标题】:r- lapply over a listr- 在列表上应用
【发布时间】:2015-01-26 20:37:13
【问题描述】:

我有一张这样的桌子:

                                          dir      E_numdir
45 OCAMPO 1253 2                                    1253, 2
74 BENITO LYNCH 1883                                   1883
24 PRESIDENTE DE LA PLA 148                             148

其中 E_numdir 是一个字符 我需要评估 E_numdir 中每个数字的最后 2 位数字,如果它们为 0,则在另一列中获得标记。

为了评估这一点,我尝试了:

lapply(ex$E_numdir , function(w) str_sub(w, -2, -1))  

但我只能从最后一个数字中得到最后 2 位数字。

所以我尝试了:

lapply(as.vector(unlist(strsplit(ex$E_numdir,",")),mode="list") , function(w) str_sub(w, -2, -1))

但我得到的行数比我的行数多。每个元素一个。

我需要得到另一列'xx'

                                          dir      E_numdir   xx
45 OCAMPO 1253 2                                    1253, 2   53,2
74 BENITO LYNCH 1883                                   1883   83 
24 PRESIDENTE DE LA PLA 148                             148   48

如何将函数应用于所有数字但将结果存储在同一行中?

谢谢。

【问题讨论】:

  • 使用reshape2::colsplit 之类的东西首先清理您的数据,这样您就不会在用逗号分隔的单个列中包含多个值。

标签: r loops lapply


【解决方案1】:

你可以的

library(stringi)

ex$last2 <- vapply(
    ## split on ", " - comma then a space
    stri_split_fixed(ex$E_numdir, ", "),
    ## paste the last two characters of each element together
    function(x) stri_c(stri_sub(x, -2), collapse = ","),
    ## set the return value for vapply()
    character(1L)
)

给了

                          dir E_numdir last2
1            45 OCAMPO 1253 2  1253, 2  53,2
2        74 BENITO LYNCH 1883     1883    83
3 24 PRESIDENTE DE LA PLA 148      148    48

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2015-04-18
    • 1970-01-01
    • 2017-12-31
    • 2020-05-27
    • 2015-09-14
    相关资源
    最近更新 更多