我是R的新手,并且被快速操纵数据和返回可读信息所带来的力量所震撼。但就目前而言,我已陷入困境。
我有一个大型数据集,我已将其作为数据框导入。我想使用正则表达式(grepl
?)搜索数据框的特定列,并将搜索结果放入新列中。我认为我可以使用apply
或ddply
执行此操作,但我似乎无法将这些功能完全包围在这些功能中。
这是一个示例数据框...
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
我意识到这对于那些先进的人来说似乎非常微不足道。提前感谢您抽出宝贵时间帮助我学习。此外,虽然我正在寻找这个特定问题的答案,但我很乐意听取有关学习/阅读的内容的建议,这将有助于我更好地掌握这种类型的数据操作。
答案 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)
另一种方法是跨行使用apply
。 any
是一个返回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