【问题标题】:Searching across several columns of a dataframe搜索数据框的多列
【发布时间】:2014-08-28 09:54:46
【问题描述】:

我是 R 新手,对它在快速处理数据和返回可读信息方面的强大功能感到震惊。不过,现在我被困住了。

我有一个已作为数据框导入的大型数据集。我想使用正则表达式(grepl?)搜索数据框的特定列,并将搜索结果放入新列中。我认为我可以使用 applyddply 来做到这一点,但我似乎无法很好地围绕这些功能来做到这一点。

这是一个示例数据框...

df <- structure(list(w = structure(c(3L, 2L, 1L, 3L, 3L), .Label = c("b", 
"c", "d"), class = "factor"), x = structure(c(1L, 2L, 1L, 2L, 
3L), .Label = c("a", "b", "d"), class = "factor"), y = structure(c(2L, 
1L, 1L, 1L, 1L), .Label = c("a", "d"), class = "factor")), .Names = c("w", 
"x", "y"), row.names = c(NA, -5L), class = "data.frame")

返回...

  w x y
1 d a d
2 c b a
3 b a a
4 d b a
5 d d a

我试过:search &lt;- apply(df, 2, function(x){grepl("d", x, perl=TRUE)})(除其他外),它返回:

         w     x     y
[1,]  TRUE FALSE  TRUE
[2,] FALSE FALSE FALSE
[3,] FALSE FALSE FALSE
[4,]  TRUE FALSE FALSE
[5,]  TRUE  TRUE FALSE

我想要的结果是......

  w x y z
1 d a d TRUE
2 c b a FALSE
3 b a a FALSE
4 d b a TRUE
5 d d a TRUE

我意识到这对你们这些高级的人来说似乎很微不足道。提前感谢您花时间帮助我学习。此外,虽然我正在寻找这个特定问题的答案,但我很想听听有关学习/阅读的建议,这将有助于我更好地掌握这种类型的数据操作。

【问题讨论】:

    标签: r plyr dplyr


    【解决方案1】:

    您不需要正则表达式。您可以使用rowSums

    当我们使用df == "d"时,整个数据框都被转换为逻辑值。由于FALSE 在数值上等于零,任何大于零的行总和意味着该行至少包含一个"d"

    > df$z <- rowSums(df == "d") > 0
    > df
    #   w x y     z
    # 1 d a d  TRUE
    # 2 c b a FALSE
    # 3 b a a FALSE
    # 4 d b a  TRUE
    # 5 d d a  TRUE
    

    如果您需要对几个不同的值执行此操作,您可以编写一个函数。

    fun <- function(data, what) {
        data$z <- rowSums(data == what) > 0
        data
    }
    fun(df, "b")
    fun(df, "d")
    lapply(c("a", "b"), fun, data = df)
    

    另一种方法是跨行使用applyany 是一个函数,如果它的任何第一个参数是 TRUE,则返回 TRUE

    df$z <- apply(df == "d", 1, any)
    

    关于参考资料,我认为学习 R 的最佳地点是从编写 R 的人那里。查看手册http://cran.r-project.org/doc/manuals/

    【讨论】:

      【解决方案2】:

      以下也可以使用:

      df$result = apply(df, 1, function(x) any(grepl("d",x)))
      df
        w x y result
      1 d a d   TRUE
      2 c b a  FALSE
      3 b a a  FALSE
      4 d b a   TRUE
      5 d d a   TRUE
      

      【讨论】:

        猜你喜欢
        • 2012-06-05
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        相关资源
        最近更新 更多