Вставьте NA на случай отсутствия наблюдений при использовании subset (), а затем dcast или tapply

У меня есть следующий фрейм данных (это только заголовок фрейма данных). Столбец ID является предметом (у меня больше предметов во фрейме данных, а не только предмет №99). Я хочу рассчитать среднее значение rt по предмету и условию только для наблюдений, у которых z.score (в абсолютных значениях) меньше 1.

> b
  subject   rt ac condition     z.score
1      99 1253  1     200_9  1.20862682
2      99 1895  1     102_2  2.95813507
3      99 1049  1      68_1  1.16862102
4      99 1732  1      68_9  2.94415384
5      99  765  1      34_9 -0.63991180
7      99 1016  1      68_2 -0.03191493

Я знаю, что могу сделать это с помощью tapply или dcast (из reshape2) после подмножества данных:

b1 ‹- подмножество (b, abs (z.score)‹ 1)

b2 ‹- dcast (b1, субъект ~ условие, среднее, значение. var = rt)

  subject      34_1      34_2      34_9      68_1      68_2     68_9     102_1     102_2    102_9     200_1     200_2    200_9
1      99 1028.5714  957.5385  861.6818  837.0000  969.7222 856.4000  912.5556  977.7273 858.7800 1006.0000 1015.3684 913.2449
2    5203  957.8889  815.2500  845.7750  933.0000  893.0000 883.0435  926.0000  879.2778 813.7308  804.2857  803.8125 843.7200
3    5205 1456.3333 1008.4286  850.7170 1142.4444  910.4706 998.4667  935.2500  980.9167 897.4681 1040.8000  838.7917 819.9710
4    5306 1022.2000  940.5882  904.6562 1525.0000 1216.0000 929.5167  955.8571  981.7500 902.8913  997.6000  924.6818 883.4583
5    5307 1396.1250 1217.1111 1044.4038 1055.5000 1115.6000 980.5833 1003.5714 1482.8571 941.4490 1091.5556 1125.2143 989.4918
6    5308  659.8571  904.2857  966.7755  960.9091 1048.6000 904.5082  836.2000 1753.6667 926.0400  870.2222 1066.6667 930.7500

В приведенном выше примере для b1 у каждого из испытуемых были наблюдения, которые соответствовали требованиям подмножества. Однако может случиться так, что по определенному предмету у меня не будет наблюдений после того, как я подгруппу. В этом случае я хочу получить NA в b2 для этого субъекта в конкретном состоянии, в котором у него нет наблюдений, соответствующих требованиям подмножества. У кого-нибудь есть идея, как это сделать? Любая помощь будет оценена.

Бест, Аяла


person ayalaall    schedule 26.11.2014    source источник
comment
Пожалуйста, попробуйте отформатировать свой пост.   -  person akrun    schedule 26.11.2014
comment
Также попробуйте использовать dput, чтобы мы могли видеть точную структуру вашего кода.   -  person JasonAizkalns    schedule 26.11.2014
comment
Как отформатировать сообщение, чтобы вам было лучше видно? Спасибо, Аяла   -  person ayalaall    schedule 26.11.2014
comment
@AyalaAllon, пожалуйста, посмотрите здесь, как форматировать: stackoverflow.com/help/formatting   -  person Henrik    schedule 26.11.2014
comment
Исправил форматирование, Спасибо!   -  person ayalaall    schedule 26.11.2014
comment
Ваша проблема четко не сформулирована. У вас есть несколько действительных data.frame b1, поэтому можете ли вы показать нам, в каких столбцах нет наблюдений и какое значение указывает на отсутствие наблюдений? В качестве простого примера, если бы b1$ac !=1 означает отсутствие наблюдения, вы могли бы сделать b1$subject[which(b1$ac!=1)] <- NA.   -  person Carl Witthoft    schedule 26.11.2014
comment
Перефразирую свой вопрос. У меня есть переменная b- содержит длинные данные, и я хочу преобразовать ее в широкие данные (b2) после того, как я subset (). В subset () я хочу, чтобы все строки в b, их значения в z.score были меньше 1 (по абсолютной величине). Это то, что я получаю в b1. Однако для некоторых предметов все наблюдения имеют z.score ›1. В этом случае b1 не будет содержать этот предмет, а затем, когда я буду использовать dcast (), я получу b2, который не содержит всех предметов). Я не хочу этого. Я хочу создать b2 с NA для условий, в которых у испытуемых не было наблюдений, в соответствии с подмножеством, которое я использовал.   -  person ayalaall    schedule 26.11.2014
comment
Если subject является множителем, а не целым числом, вы можете использовать аргумент drop в dcast, чтобы сохранить отсутствующие комбинации в выходном наборе данных. По умолчанию они отброшены, поэтому используйте drop = FALSE. Вы получите NaN заполнение всех пропущенных значений (см. Аргумент fill). Если вы действительно хотите NA, вы можете использовать что-то вроде fill = as.numeric(NA).   -  person aosmith    schedule 26.11.2014


Ответы (2)


В dcast есть аргумент drop, который вы можете использовать в этой ситуации, но вам нужно будет преобразовать subject в коэффициент.

Вот набор данных со вторым идентификатором субъекта, который не имеет значений, соответствующих вашему условию, что абсолютное значение z.score меньше единицы.

library(reshape2)

bb = data.frame(subject=c(99,99,99,99,99,11,11,11), rt=c(100,150,2,4,10,15,1,2), 
             ac=rep(1,8), condition=c("A","A","B","D","C","C","D","D"),
             z.score=c(0.2,0.3,0.2,0.3,.2,2,2,2))

Если вы измените его на широкий формат с помощью dcast, вы потеряете номер темы 11 даже с аргументом drop.

dcast(subset(bb, abs(z.score) < 1), subject ~ condition, fun = mean, 
     value.var = "rt", drop = FALSE)

  subject   A B  C D
1      99 125 2 10 4

Сделайте subject фактором.

bb$subject = factor(bb$subject)

Теперь вы можете dcast с drop = FALSE сохранить все предметы в широком наборе данных.

dcast(subset(bb, abs(z.score) < 1), subject ~ condition, fun = mean, 
     value.var = "rt", drop = FALSE) 

  subject   A   B   C   D
1      11 NaN NaN NaN NaN
2      99 125   2  10   4

Чтобы получить NA вместо NaN, вы можете использовать аргумент fill.

dcast(subset(bb, abs(z.score) < 1), subject ~ condition, fun = mean, 
     value.var = "rt", drop = FALSE, fill = as.numeric(NA)) 

  subject   A  B  C  D
1      11  NA NA NA NA
2      99 125  2 10  4
person aosmith    schedule 26.11.2014
comment
Привет, aosmith! Большое спасибо за ваш ответ и помощь. Это действительно то, что мне нужно сделать. Еще раз спасибо !!!! - person ayalaall; 02.12.2014
comment
Привет @aosmith. Если у меня bb1, в котором все z.score ‹1.5. bb1 = data.frame (subject = c (99,99,99,99,99,11,11,11), rt = c (100,150,2,4,10,15,1,2), + ac = rep (1,8), условие = c (1,1,2,4,3,3,4,4), + z.score = c (0,2,0.3,0.2,0.3,0.3,0.2,0.2,0.2) ). Я хочу использовать dcast с abs (z.score) ›1.5: bb1 $ subject = factor (bb1 $ subject). dcast (подмножество (bb1, abs (z.score) ›1.5), тема ~ условие, fun = length, value.var = rt, drop = FALSE). Но я получаю сообщение об ошибке Ошибка в dim (order) ‹- ns: dims [product 1] не соответствует длине объекта [0]. - person ayalaall; 02.12.2014
comment
Еще раз привет @asomith: вы знаете, как я могу решить ошибку, полученную в моем предыдущем комментарии? Бест, Аяла - person ayalaall; 02.12.2014
comment
@AyalaAllon Похоже, dcast не работает с 0-строчным data.frame. Я бы, вероятно, решил эту проблему, просто сначала агрегируя набор данных, а затем выполняя кастинг. Например, используя пакет dplyr, вы можете сделать что-то вроде bb1 %>% group_by(subject, condition) %>% summarise(n = length(rt[abs(z.score) > 1.5])) %>% dcast(subject ~ condition, value.var = "n"), который вычисляет 0 для размеров группы или bb1 %>% group_by(subject, condition) %>% summarise(n = n()[abs(z.score) > 1.5]) %>% dcast(subject ~ condition, value.var = "n"), если вы хотите все NA. - person aosmith; 02.12.2014
comment
Привет @asomith. Большое спасибо! У меня есть еще один небольшой вопрос по поводу использования декаста в этой ситуации. В своем последнем комментарии вы использовали decast (subject ~ condition, value.var = n), что означает, что я получу значение value.var, которое я хочу для каждой темы и условия. Однако что, если я хочу сделать то же самое, что и вы, но вместо условия субъекта я хочу получить значение value.var для каждого объекта (т.е. по условию). Я все еще хочу использовать для этого dcast, поэтому я смогу объединить декаст с вашим отличным предложением в вашем последнем комментарии. Любая помощь будет оценена - person ayalaall; 03.12.2014
comment
@AyalaAllon Я не совсем уверен, что вы пытаетесь сделать (может быть, суммировать value.var?). Я рекомендую задать новый вопрос, что упростит включение воспроизводимого примера того, что вы хотели бы сделать. Вы также можете принять этот ответ, если он отвечает на ваш исходный вопрос. - person aosmith; 03.12.2014
comment
@asomith. Спасибо. Я сейчас выложу новый вопрос. Бест, Аяла - person ayalaall; 03.12.2014
comment
Привет. Я делаю именно то, что предложил @asomith: test1 <- raw_data_rt %>% group_by(subject) %>% summarise(n = mean(rt[abs(z_score) < 1])) %>% dcast(subject ~ "t1rt", value.var = "n", fun = mean). Дело в том, что теперь я включаю это в функцию, так что имя столбца в group_by не всегда является предметом. Один из моих аргументов функции - id, который является именем столбцов для group_by. Однако, если вместо темы я напишу raw_data_rt[[id]], я получу NA в столбце t1rt. Что я могу сделать, чтобы решить эту проблему? Бест, Аяла - person ayalaall; 25.06.2015
comment
@ayalaall Вы должны задать это как новый вопрос с воспроизводимым примером вашей текущей проблемы. Для правильной работы этих функций, которые вы использовали, обычно требуются имена переменных из заданного набора данных, поэтому вам нужно найти способ передать им имя переменной в функции. - person aosmith; 25.06.2015
comment
Спасибо. В конце я решил изменить имена столбцов на фиксированные имена, используя: names(df)[names(df) == 'old.var.name'] <- 'new.var.name', чтобы я мог работать так же, как и раньше. Спасибо! Аяла - person ayalaall; 27.06.2015

Вам нужно следующее? Я создал аналогичный набор данных "bb"

library("plyr")  ###needed for . function below
bb<- data.frame(subject=c(99,99,99,99,99,11,11,11),rt=c(100,150,2,4,10,15,1,2), ac=rep(1,8) ,condition=c("A","A","B","D","C","C","D","D"),     z.score=c(0.2,0.3,0.2,0.3,1.5,-0.3,0.8,0.7))

bb  
  subject  rt ac condition z.score
#1      99 100  1         A     0.2
#2      99 150  1         A     0.3
#3      99   2  1         B     0.2
#4      99   4  1         D     0.3
#5      99  10  1         C     1.5
#6      11  15  1         C    -0.3
#7      11   1  1         D     0.8
#8      11   2  1         D     0.7

Затем вы вызываете dcast с включенным подмножеством:

cc<-dcast(bb,subject~condition, mean, value.var = "rt",subset = .(abs(z.score)<1))  
cc  
   subject   A   B   C   D 
#1      11 NaN NaN  15 1.5
#2      99 125   2 NaN 4.0
person sandro scodelller    schedule 26.11.2014
comment
Привет, Сандро, большое спасибо за ответ. Если я правильно понимаю, ваше предложение и ответ aosmith (см. Ответ выше) являются одним и тем же предложением. Это именно то, что я хотел. Еще раз спасибо! - person ayalaall; 02.12.2014
comment
Да, но его лучше, потому что он также объясняет, как использовать ключевое слово drop :-) Вот почему я проголосовал за его ответ ;-) - person sandro scodelller; 02.12.2014