2016-07-23 2 views
-2

Мне нужна функция, которая проверяет частоту значений в строке в df, а затем проверяет, появляется ли одно из значений 6 или более раз, и если да, отображает это значение в новом столбце. Если нет, вместо этого записывается «nope» в том же новом столбце. В приведенном ниже примере: значения в строках равны 1, 2 или 3. Поэтому, если одно из значений 1,2, or3 появляется 6 или более раз для каждой строки, какое бы значение (1,2 или 3) должен появиться в новом столбце. Если ни одно из значений не появляется 6 или более раз для каждой строки, значение в этом же новом столбце должно быть «nope». exampleФункция для извлечения запросов чисел в строках в R

+0

Вы можете проверить 'apply' и' table' – akrun

ответ

0

Попробуйте применить функцию table для каждой строки с помощью

make_count_col <- function(x) { 
    cnt <- apply(x, 1, table) 
    x$newcolumn <- apply(cnt, 2, function(y) { 
    if (max(y, na.rm = T) < 6) 
     out <- 'nope' 
    else 
     out <- names(y)[which.max(y)] 
    out 
    }) 
    x 
} 

Ваш пример реплицируется

x <- as.data.frame(matrix(c(1, 2, 1, 2, 2, 2, 2, 2, 3, 
          2, 3, 1, 1, 3, 2, 1, 1, 3), nrow = 2, byrow = T)) 
colnames(x) <- paste0('svo', 1:9) 
make_count_col(x) 
    svo1 svo2 svo3 svo4 svo5 svo6 svo7 svo8 svo9 newcolumn 
    1 2 1 2 2 2 2 2 3   2 
    2 3 1 1 3 2 1 1 3  nope 
+0

Дорогой Бен, спасибо, но я получить ошибку «Dim (x) должна иметь положительную длину», которая в основном говорит мне, что она не может применяться :) функция apply для объекта cnt, поскольку объект cnt является списком. Я попытался создать объект cnt за пределами функции с помощью «apply (x, 1, table)», но когда я прикрепляю его обратно к фреймворку данных, он создает столбец с векторами, содержащий число, если происходит, что, естественно, понижает весь фрейм данных в список, и я не могу далее применять функцию max. –

+0

Можете ли вы предоставить лучший пример того, что вы передаете функции как 'x'? Я попытался использовать то, что вы дали выше, и это работает для меня. –

+0

Дорогой Бен, спасибо, Это была застрявшая сессия R :(Большое спасибо за вашу помощь –