搜索数据框的多个列

时间:2014-08-28 09:54:46

标签: r plyr dplyr

我是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 <- 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

我意识到这对于那些先进的人来说似乎非常微不足道。提前感谢您抽出宝贵时间帮助我学习。此外,虽然我正在寻找这个特定问题的答案,但我很乐意听取有关学习/阅读的内容的建议,这将有助于我更好地掌握这种类型的数据操作。

2 个答案:

答案 0 :(得分:4)

您不需要正则表达式。您可以使用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/上的手册

答案 1 :(得分:3)

以下也可以使用:

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