2014-08-28 3 views
2

Я новичок в R и сдулся от мощности, которую он имеет при быстром управлении данными и возвращении читаемой информации. Пока, однако, я застрял.Поиск по нескольким столбцам информационного кадра

У меня есть большой набор данных, который я импортировал в качестве фрейма данных. Я хотел бы искать по определенным столбцам фрейма данных с помощью regex (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 

Я понимаю, что это кажется очень тривиальным для тех из вас, кто продвинулся вперед. Заранее благодарим за то, что нашли время, чтобы помочь мне учиться. Кроме того, хотя я ищу ответ на эту конкретную проблему, мне бы хотелось услышать предложения по изучению/чтению, которые помогут мне лучше понять этот тип манипуляций с данными.

ответ

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 от людей, которые писали Р. Проверьте руководства на http://cran.r-project.org/doc/manuals/

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 
Смежные вопросы