R: Применение функции dprime - ошибка apply() 'dim(X) должна иметь положительную длину'

Я пытаюсь написать функцию dprime, в которой я вычитаю FA из z-показателей попаданий, чтобы получить значение dprime для каждого участника. Участники — это строки, а z-показатели — это столбцы. Мой набор данных (newData) имеет размер 18x16, но я хочу игнорировать первые 8 столбцов. Я хочу повторить вычисление dprime для каждого условия и создать новый набор данных 18x4 (newData2) с выводом.

# Function to apply
dprimeFun <- function(twoColumns){
  # Give the function two columns at a time
  zH <- twoColumns[ 1 ]
  zF <- twoColumns[ 2 ]
  dprime <- zH - zF 
  return(dprime)
}

# Apply the function
newData2 <- cbind(
  # Condition 1 dprimes
  apply(
    newData[ c( "zH1","zF1" ) ], MARGIN=1, FUN=dprimeFun
  ),
  # Repeat for each condition
)

Когда я запускаю это, я получаю следующую ошибку:

Error in apply(newData[c("zH1", "zF1")], MARGIN = 1, FUN = dprimeFun) : 
  dim(X) must have a positive length

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

Я также прочитал часто задаваемые вопросы по R 'Почему матрицы теряют размеры?' но я не понимаю, как это применимо к моему набору данных 18x16.

Я новичок в R, поэтому помощь будет очень признательна.

Редактировать:

# newData structure
> str(newData)
 num [1:18, 1:16] 0.833 0.833 0.833 0.833 0.833 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:16] "H1" "F1" "H2" "F2" ...

# newData column names
> colnames(newData)
 [1] "H1"  "F1"  "H2"  "F2"  "H3"  "F3"  "H4"  "F4"  "zH1" "zF1" "zH2" "zF2" "zH3" "zF3"
[15] "zH4" "zF4"

person szi    schedule 29.01.2014    source источник
comment
Ты так далеко, что трудно понять, куда ты хочешь пойти. Возможно, если показать несколько строк newData? Если столбцы zH1 и zF1 уже не являются z-показателями, это не будет вычислять dprime. Все ваши cbind и apply совершенно бессмысленны и неверны. Вы пытались просто вызвать свою функцию и передать ей два столбца data.frame в качестве аргумента? Действительно похоже, что вы много думали о вещах и читали о них, но что вам действительно нужно сделать, так это попробовать что-то и посмотреть, что получится. Ваш компьютер не взорвется. И это гораздо лучший способ изучить этот материал.   -  person John    schedule 29.01.2014
comment
Что происходит, когда вы вводите: dim(newData[ c( "zH1","zF1" ) ])?   -  person jlhoward    schedule 29.01.2014
comment
@Джон Спасибо за ваш комментарий. Столбцы zH1 zF1 уже являются z-оценками. Вот несколько строк из newData:   -  person szi    schedule 29.01.2014
comment
Я попробовал то, что вы сказали о передаче ему двух столбцов data.frame (я дал ему столбцы zH1 и zH2), и он вернулся с 0 в качестве ответа. Я не уверен, почему 1) ответ равен 0 и 2) почему это одно число, а не 18 чисел. Честно говоря, я настолько новичок в R, что действительно понятия не имею, что делаю, причина, по которой я использовал cbind и apply, заключалась в том, что я заставил его работать для расчета частоты попаданий, поэтому я подумал, что это может работать и для следующего этапа. Я ценю, что вы нашли время, чтобы ответить мне.   -  person szi    schedule 29.01.2014
comment
@jlhoward Это возвращается как NULL. Я также попробовал dim() на моем двухстолбцовом data.frame, как предложил Джон, который вернулся 18x2. Я не уверен, что понимаю, почему у одного есть размеры, а у другого нет ... Если бы вы могли дать мне какие-либо указания о том, что происходит не так, я был бы очень признателен.   -  person szi    schedule 29.01.2014
comment
OK. Введите str(newData) и опубликуйте результат, желательно как редактирование вашего вопроса. Я предполагаю, что имена столбцов не такие, как вы думаете. Если я наберу newData<-data.frame(zH1=1:10,zF1=1:10); dim(newData); dim(newData[,c("zH1","zF1")]), то оба раза получу один и тот же ответ (10,2).   -  person jlhoward    schedule 29.01.2014
comment
Спасибо, я отредактировал свой вопрос, включив в него str(newData) и colnames(newData).   -  person szi    schedule 30.01.2014


Ответы (1)


Возможно, вы хотите...

newData$dprime <- dprimeFun(newData[,c("zH1", "zF1")])

Но это необычайно трудно сказать.

person John    schedule 29.01.2014
comment
Спасибо. Я попробовал следующее (это не позволит мне сделать newData$dprime, потому что dprime не является именем чего-либо в этом фрейме данных): blah <- dprimeFun(newData[,c("zH1", "zF1")]) Он создал список с двумя элементами, которые оба были 0. Я пытаюсь вычислить dprime из двух столбцов, по 18 рядов в каждом, и повторите это 4 раза для каждого набора из двух столбцов (попадания и FA для каждого условия). Я не сомневаюсь, что мой код беспорядок, поэтому я пришел сюда, и я очень новичок в R. Если я могу что-то сделать, чтобы прояснить проблему, пожалуйста, скажите мне. Я никогда раньше не задавал здесь вопросов. - person szi; 29.01.2014