Выбор строки с наиболее полной информацией - PullRequest
0 голосов
/ 06 декабря 2010

Допустим, у меня есть строки, подобные этой:

    First, Last, Address, Address 2, Email, Custom1, Custom2, Custom3
1    A, B, C, D, E@E.com,1,2,3
2    A,  , C, D, E@E.com,1,2,
3     ,  ,  ,  , E@E.com,1, ,  

Что я хотел бы сделать, это создать функцию, которая извлекает эту строку, которая является наиболее полной, и мне интересно, есть ли пакеты илиуже существующие методы (рекомендации, даже) для этого.В приведенном выше примере я хотел бы иметь функцию, которая выбирает строку 1.

Я не могу использовать complete.cases () или na.omit (), потому что во многих случаях случаи не завершены исодержать по крайней мере один NA.Я пытался объединить unique () с несколькими конкретными пуллами ... но мне не очень повезло автоматизировать эту задачу манипуляции.

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

Вы можете использовать факты, которые "" меньше, чем любая буква или любое число, поэтому просто используйте sum (x >"" , na.rm=TRUE) в применяемой среде:

> apply(tst, 1, function(x) sum(x > "", na.rm=TRUE))
[1] 8 7 6
> idx <- apply(tst, 1, function(x) sum(x > "", na.rm=TRUE))
> tst[which.max(idx),]
   First Last Address Address.2    Email Custom1 Custom2 Custom3
1 1    A    B       C         D  E@E.com       1       2       3
1 голос
/ 06 декабря 2010

Хотя уже есть некоторые рабочие решения, которые я выкладываю. Он похож (в использовании apply и sum), но использует регулярные выражения (через grepl) для достижения этого. Таким образом, вы можете попробовать использовать любой шаблон, который вы хотите. Используемый трюк заключается в том, что логические значения могут быть суммированы:

x <- structure(list(First = c("A", "A", ""), Last = c("B", "  ", "  "
), Address = c("C", "C", "  "), Address.2 = c("D", "D", "  "), 
    Email = c(" E@E.com", " E@E.com", " E@E.com"), Custom1 = c(1L, 
    1L, 1L), Custom2 = c(2L, 2L, NA), Custom3 = c(3L, NA, NA)), .Names = c("First", 
"Last", "Address", "Address.2", "Email", "Custom1", "Custom2", 
"Custom3"), class = "data.frame", row.names = c(NA, -3L))

mostComplete <- function(x) {
    tmp <- apply(x,1,grepl, pattern = "[[:alnum:]]")
    return(which.max(apply(tmp,2,sum)))
}

mostComplete(x)

[1] 1

PS: Дайте молодежи шанс ...

1 голос
/ 06 декабря 2010

Вы можете преобразовать в символ и посчитать по строкам, сколько у вас нет пустых значений:

R> Lines <- "
+ First, Last, Address, Address 2, Email, Custom1, Custom2, Custom3
+  A, B, C, D, E@E.com,1,2,3
+  A,  , C, D, E@E.com,1,2,
+   ,  ,  ,  , E@E.com,1, ,
+ "
R> 
R> con <- textConnection(Lines)
R> df <- read.table(con, header=TRUE, sep=",")
R> close(con)
R> 
R> m <- as.matrix(df)  # now all char
R> 
R> counts <- apply(m, 1, function(r) { r <- gsub("^ $", "", r); 
+                                      sum(na.omit(r) != "") } )
R> 
R> df[which.max(counts), ]   # pick row of maximum
  First Last Address Address.2    Email Custom1 Custom2 Custom3
1     A    B       C         D  E@E.com       1       2       3
R> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...