Как выполнить функцию в каждой строке фрейма данных и вставить только один элемент вывода в виде нового столбца в этой строке - PullRequest
5 голосов
/ 25 ноября 2010

Точный биномиальный тест легко выполнить с двумя значениями, но что произойдет, если кто-то захочет провести тест на целую кучу успехов и количество испытаний.Я создал таблицу данных о чувствительности теста, потенциальном количестве зачисленных в исследование людей, а затем для каждой строки вычисляю, каковы могут быть успехи.Вот код.

sens <-seq(from=.1, to=.5, by=0.05)
enroll <-seq(from=20, to=200, by=20)
df <-expand.grid(sens=sens,enroll=enroll)
df <-transform(df,succes=sens*enroll)

Но теперь, как мне использовать комбинацию успехов и количество попыток каждой строки для выполнения биномиального теста.

Меня интересует только верхний предел 95% доверительного интервала биномиального теста.Я хочу, чтобы это единственное число было добавлено к фрейму данных в виде столбца с именем «upper.limit»

Я думал о чем-то вроде

binom.test(succes,enroll)$conf.int    

Увы, conf.int даетчто-то типа

[1] 0,1266556 0,2918427
attr (, "conf.level")
[1] 0,95

Все, что я хочу, это всего лишь 0,2918427

Кроме того, у меня есть ощущение, что где-то должен быть do.call и, может быть, даже неудачно, но я не знаю, как это пройдет через весь фрейм данных.Или, может быть, мне следует использовать plyr?

Очевидно, у меня кружится голова.Пожалуйста, остановите это.

Ответы [ 2 ]

9 голосов
/ 25 ноября 2010

Если это дает вам (почти) то, что вы хотите, то попробуйте это:

binom.test(succes,enroll)$conf.int[2]

И примените по всей доске или по строкам, как это было:

> df$UCL <- apply(df, 1, function(x)  binom.test(x[3],x[2])$conf.int[2] )
> head(df)
  sens enroll succes       UCL
1 0.10     20      2 0.3169827
2 0.15     20      3 0.3789268
3 0.20     20      4 0.4366140
4 0.25     20      5 0.4910459
5 0.30     20      6 0.5427892
6 0.35     20      7 0.5921885
1 голос
/ 25 ноября 2010

Вот, пожалуйста:

R> newres <- do.call(rbind, apply(df, 1, function(x) { 
+                     bt <- binom.test(x[3], x[2])$conf.int; 
+                     newdf <- data.frame(t(x), UCL=bt[2]) }))
R>
R> head(newres)
  sens enroll succes     UCL
1 0.10     20      2 0.31698
2 0.15     20      3 0.37893
3 0.20     20      4 0.43661
4 0.25     20      5 0.49105
5 0.30     20      6 0.54279
6 0.35     20      7 0.59219
R> 

При этом используется apply, чтобы перебрать существующие данные, вычислить тест, вернуть желаемое значение, вставив его в новую (одну строку) data.frame,И затем мы склеиваем все эти 90 объектов data.frame в новый отдельный объект с do.call(rbind, ...) поверх списка, который мы получили из apply.

Ах, да, если вы просто хотите напрямую вставить один столбец,другой ответ рулит, как просто.Мой более длинный ответ показывает, как вырастить или построить data.frame во время развертки apply.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...