Я хотел бы применить некоторую функцию к каждой строке кадра данных в R.
Функция может возвращать однострочный фрейм данных или ничего (я думаю, 'return ()' ничего не возвращает?).
Я хотел бы применить эту функцию к каждой строке данного кадра данных и получить результирующий кадр данных (который, возможно, короче, то есть имеет меньше строк, чем исходный).
Например, если исходный фрейм данных выглядит примерно так:
id size name
1 100 dave
2 200 sarah
3 50 ben
И функция, которую я использую, получает строку n в кадре данных (то есть в однострочном кадре данных), возвращает его как есть, если имя рифмуется с «храбрым», в противном случае возвращает ноль, тогда результат должен быть:
id size name
1 100 dave
Этот пример на самом деле относится к фильтрации фрейма данных, и я хотел бы получить как ответ, специфичный для такого рода задач, так и более общий случай, когда даже результат вспомогательной функции (тот, который работает на одном строка) может быть произвольным кадром данных с одной строкой. Обратите внимание, что даже в случае фильтрации я хотел бы использовать некоторую изощренную логику (не такую простую, как $size>100
, а более сложное условие, которое проверяется функцией, скажем, boo(single_row_df)
.
P.s.
В этих случаях я до сих пор использовал apply(df, MARGIN=1)
, а затем do.call(rbind ...)
, но я думаю, что это доставит мне некоторые неудобства, когда мой фрейм данных содержит только одну строку (я получаю Error in do.call(rbind, filterd) : second argument must be a list
)
UPDATE
После ответа Стивена я сделал следующее:
ranges.filter <- function(ranges,boo) {
subset(x=ranges,subset=!any(boo[start:end]))
}
Затем я вызываю ranges.filter
с некоторым диапазоном данных, который выглядит следующим образом:
start end
100 200
250 400
698 1520
1988 2147
...
и некоторый логический вектор
(TRUE,FALSE,TRUE,TRUE,TRUE,...)
Я хочу отфильтровать любые диапазоны, которые содержат значение ИСТИНА из логического вектора. Например, первый диапазон 100 .. 200
останется в кадре данных, если логический вектор будет FALSE
в позициях 100 .. 200
.
Это похоже на работу, но я получаю предупреждение, говорящее numerical expression has 53 elements: only the first used
.